2010-11-06 21 views
3

J'expose une classe d'arborescence C++ en utilisant Boost.Python à python. La classe de noeud contient une liste de nœuds enfants et fournit une méthodeBoost.Python: Propriété des variables de pointeur

void add_child(Node *node) 

La classe Node prend possession du pointeur de nœud fourni et supprime les nœuds enfants lorsque le destuctor est appelé.

Je suis exposant la méthode add_child comme:

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

Ma question réelle est: Comment je ne dis Boost.Python que la classe Node prend possession des nœuds enfants?

Parce que si j'exécute le code suivant en python:

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

l'objet référencé par la variable de nœud est supprimé deux fois à la fin du script. Une fois lorsque la variable de noeud est supprimée et une seconde fois lorsque le parentNode est supprimé.

Répondre

3

répondre à ma propre question:

J'ai manqué une entrée de la FAQ dans la documentation Boost.Python qui m'a donné le droit soupçon:

//The node class should be held by std::auto_ptr 
class_<Node, std::auto_ptr<Node> >("Node") 

Créer une fonction mince enveloppe pour la méthode add_child:

void node_add_child(Node& n, std::auto_ptr<Node> child) { 
    n.add_child(child.get()); 
    child.release(); 
} 

Code complet pour exposer la classe de noeud:

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