2

基本的に、修正しようとしている非常に単純なノード テスト ケースがあります。

getChild と getParent を持つ単純な Node クラスがあります

子は addChild 関数を介して割り当てることができます

次に、この関数は関連するクラスに親を自動的に設定します(したがって、C ++側から)

残念ながら、それを行うと、python参照が失われます..

コードは理解しやすいはずです:

基本的なメイン クラス MyNode :

class MyNode
{
public:
    MyNode(): m_name("unknown") {}
    MyNode(std::string name): m_name(name) {}
    MyNode(MyNode * const o) : m_name(o->m_name) {}
    virtual ~MyNode() {}

    std::string getName() const { return m_name; }
    void setName(std::string name) { m_name = name; }
    boost::shared_ptr<MyNode> getChild() const { return m_child; }
    const boost::shared_ptr<MyNode> & getParent() const { return m_parent; }

    void addChild(boost::shared_ptr<MyNode> node) {
        m_child = node;
        node->m_parent = boost::make_shared<MyNode>(this);
    }

private:
    std::string m_name;
    boost::shared_ptr<MyNode> m_parent;
    boost::shared_ptr<MyNode> m_child;
};

次に、ブースト python バインディング コード:

class_< MyNode, boost::shared_ptr<MyNode>/*, MyNodeWrapper*/ >("MyNode", init<std::string>())
    .add_property( "Name", &MyNode::getName, &MyNode::setName )
    .add_property( "Child", &MyNode::getChild )
    .add_property( "Parent", make_function(&MyNode::getParent, return_internal_reference<>()))
    .def( "addChild", &MyNode::addChild )
    ;

私のpythonテストコードを完了するには:

>>> p=MyNode("p")
>>> o=MyNode("o")
>>> p.addChild(o)
>>> o.Parent
<hello_ext.MyNode object at 0x01C055A8>   << this is not equal to p
>>> p
<hello_ext.MyNode object at 0x01C06510>   << as you can see p here
>>> o.Parent
<hello_ext.MyNode object at 0x01C055A8>   << but at least the pointer doesn't change each time the Parent is called !
>>> p.Child == o                          << so for the child it works
True
>>> o.Parent == p                         << but it doeesn't work for Parent
False

問題は確かに addFunction と、boost::make_shared を使用して親を設定する方法にあります。残念ながら、何が起こっているのかわかりません..ブーストラッパーを使用しようとしました:

struct MyNodeWrapper : public MyNode, public boost::python::wrapper<MyNode>
{
    MyNodeWrapper( PyObject * a_PyObj ) : m_Self( a_PyObj ) {}
    MyNodeWrapper( PyObject * a_PyObj, const MyNode & a_Vec ) : MyNode( a_Vec ), m_Self( a_PyObj ) {}
    MyNodeWrapper( PyObject * a_PyObj, std::string name ) : MyNode( name ) , m_Self( a_PyObj ) {}

    PyObject * m_Self;
};

しかし、まだ addChild 関数をどのように変更すればよいかわかりません

何か案が ?

4

1 に答える 1

1

あなたはこれを行うことはできません:

    node->m_parent = boost::make_shared<MyNode>(this);

なしboost::enable_shared_from_this`enable_shared_from_this`の有用性は何ですか?を参照してください。

于 2013-02-27T13:14:51.553 に答える