gpt4 book ai didi

c++ - 传递没有所有权的简单指针来提升 python

转载 作者:行者123 更新时间:2023-11-30 01:24:04 26 4
gpt4 key购买 nike

我正在使用 boost python 迈出第一步来测试我的类(class),但我在为我的类(class)声明 python 模块时遇到了困难。

我的类接受一个指向另一个类的指针,但我不知道如何声明

class A{ };

class B
{
B( std::string& name, A* ptr ){
std::cot << ptr->data << std::endl; // no ownership
}
void my_foo(){
// do something!
}
};

我将类 A 导出到 python,但我遇到类 B 的问题

class_< B >("B", init< std::string, A >() )
{
.def("my_foo", &B::my_foo);
}

我有很多错误。我做错了什么?我正在阅读有关政策的信息,但在这里我认为我不必应用其中的一些政策,对吗?

亲切的问候

AFG

最佳答案

你的例子的第一个问题是 boost::python::class_ 主体不应该放在花括号内 - 它们不是宏或一种新的函数,它们只是模板类有很多花哨的运算符重载,所以你真正想要的是这样的:

class_<B>("B", init<std::string,A*>())
.def("my_foo", &B::my_foo)
;

在该片段中,您可以看到 init 编译所需的修复 - 只需将 A* 作为模板参数而不是 'A' 传递。这应该足以让它编译。<​​/p>

这是否足以让它做你想做的事取决于 B 的构造函数对它传递的指针做了什么。如果它只是在构造函数的范围内使用它,或者它对它进行深度复制,就可以了。但是如果它持有该指针(例如作为数据成员),那么如果 A 对象在 B 对象超出范围之前超出范围,您可能会遇到麻烦。如果是这种情况,您会希望使用 with_custodian_and_ward 策略,我认为它看起来像这样:

init<std::string,A*>()[with_custodian_and_ward<1,3>()]

with_custodian_and_ward 的整数模板参数指的是 __init__ 方法的位置参数; 1 指的是 self3 指的是 A* 参数,所以这意味着“保持 >A 对象传递给构造函数,直到构造的 B 对象被销毁。”

您可以在此处找到更多信息:

http://www.boost.org/doc/libs/1_52_0/libs/python/doc/v2/with_custodian_and_ward.html

关于c++ - 传递没有所有权的简单指针来提升 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14159654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com