Boost.Python: владение переменными указателя - PullRequest
3 голосов
/ 06 ноября 2010

Я выставляю класс дерева C ++, используя Boost.Python для python.Класс узла содержит список дочерних узлов и предоставляет метод

void add_child(Node *node)

. Класс Node становится владельцем предоставленного указателя узла и удаляет его дочерние узлы при вызове деструктора.

IЯ представляю метод add_child следующим образом:

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

Мой реальный вопрос: как мне сообщить Boost.Python, что класс Node становится владельцем дочерних узлов?следующий код в python:

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

объект, на который ссылается переменная узла, дважды удаляется в конце скрипта.Один раз, когда переменная узла удаляется, и второй раз, когда удаляется parentNode.

1 Ответ

4 голосов
/ 06 ноября 2010

Отвечая на мой собственный вопрос:

Я пропустил запись FAQ в документации Boost.Python, которая дала мне правильный совет:

//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)
;
...