1

我正在迈出第一步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

4

1 回答 1

5

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

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

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

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

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

整数模板参数with_custodian_and_ward引用__init__方法的位置参数;1self3A*参数,所以这意味着“让A传递给构造函数的对象保持活动状态,直到构造的B对象被销毁。”

您可以在这里找到更多信息:

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

于 2013-01-05T18:44:52.963 回答