传递没有所有权的简单指针来增强python

Abr*_*ile 1 c++ word-wrap boost-python

我正在迈出第一步boost python来测试我的班级,但是在为我的班级声明python模块时遇到了困难。

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

class A{ };

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

我将A类导出到python,但B类面临问题

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

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

亲切的问候

美国空军

jbo*_*sch 5

您的示例的第一个问题是,boost::python::class_主体不应该放在花括号内-它们不是宏或新型函数,它们只是带有大量奇特运算符重载的模板类,因此您真正想要的是某些东西像这样:

class_<B>("B", init<std::string,A*>())
    .def("my_foo", &B::my_foo)
    ;
Run Code Online (Sandbox Code Playgroud)

在该代码段中,您可以看到编译init所需的修复程序-仅A*作为模板参数而不是'A' 传递。那应该足以使其进行编译。

是否足以满足您的要求,取决于构造函数B对其传递的指针的处理方式。如果仅在构造函数的范围内使用它,或者对其进行深复制,则可以。但是,如果它保留了该指针(例如,作为数据成员),那么如果A对象先于B对象超出范围,则可能会遇到麻烦。如果是这样,您可能要使用该with_custodian_and_ward策略,我认为它看起来像这样:

init<std::string,A*>()[with_custodian_and_ward<1,3>()]
Run Code Online (Sandbox Code Playgroud)

整数模板参数,用于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