3

Boost.Pythonを使用してC++ツリークラスをPythonに公開しています。ノードクラスは子ノードのリストを保持し、メソッドを提供します

void add_child(Node *node)

Nodeクラスは、提供されたNodeポインターの所有権を取得し、デストラクタが呼び出されたときにその子ノードを削除します。

add_childメソッドを次のように公開しています。

.def("addChild", &Node::add_child)

私の実際の質問は、Nodeクラスが子ノードの所有権を取得することをBoost.Pythonにどのように伝えるのですか?

Pythonで次のコードを実行すると:

parentNode = Node()
node = Node()
parentNode.addChild(node)

ノード変数によって参照されるオブジェクトは、スクリプトの最後に2回削除されます。1回目はノード変数が削除され、2回目はparentNodeが削除されます。

4

1 に答える 1

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)
;
于 2010-11-06T10:41:17.737 に答える