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

时间:2013-01-04 15:07:21

标签: c++ boost-python wrapping

我正在使用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!
    }
};

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

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

我有很多错误。我做错了什么? 我正在阅读关于政策的内容,但在这里我认为我不应该申请其中一些,我是对的吗?

亲切的问候

AFG

1 个答案:

答案 0 :(得分:4)

你的例子的第一个问题是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对象传递给构造函数,直到构造{ {1}}对象被破坏。“

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

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