Как назначить в C ++ объект, созданный в Python?

У меня в основном очень простой тестовый пример узла, который я пытаюсь исправить.

У меня есть простой класс Node с getChild и getParent

Дочерний объект может быть назначен с помощью функции 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 для установки родителя.
Я, к сожалению, понятия не имею, что происходит ..
Я попытался использовать надстройку Boost:

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

Любая идея ?

2

Решение

Вы не можете сделать это:

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

Без boost::enable_shared_from_this, Увидеть Какая польза от `enable_shared_from_this`?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]