我正在使用Boost.Python将C ++树类暴露给python。节点类包含子节点列表并提供方法
void add_child(Node *node)
Node类获取所提供的Node指针的所有权,并在调用destuctor时删除它的子节点。
我将add_child方法暴露为:
.def("addChild", &Node::add_child)
我的实际问题是:我如何告诉Boost.Python Node类取得子节点的所有权?
因为如果我在python中执行以下代码:
parentNode = Node()
node = Node()
parentNode.addChild(node)
节点变量引用的对象在脚本末尾被删除两次。一旦节点变量被删除,第二次删除parentNode。
答案 0 :(得分:4)
回答我自己的问题:
我错过了Boost.Python文档中的FAQ条目,它给了我正确的提示:
//The node class should be held by std::auto_ptr
class_<Node, std::auto_ptr<Node> >("Node")
为add_child方法创建一个瘦包装函数:
void node_add_child(Node& n, std::auto_ptr<Node> child) {
n.add_child(child.get());
child.release();
}
公开节点类的完整代码:
//The node class should be held by std::auto_ptr
class_<Node, std::auto_ptr<Node> >("Node")
//expose the thin wrapper function as node.add_child()
.def("addChild", &node_add_child)
;