Повысьте Python и расшарил shared_ptr - PullRequest
0 голосов
/ 19 октября 2010

Пример кода для dll / pyd:

#include <boost/python.hpp>
#include <iostream>

class Base
{
public: Base() {}
public: int getValue() { return 1; }
};

typedef boost::shared_ptr<Base> BasePtr;

class ParentA : public Base
{   
public: ParentA() : Base() {}
};

typedef boost::shared_ptr<ParentA> ParentAPtr;

class Collector
{
public: Collector() {}
public: void addParent(BasePtr& parent)
{
    std::cout << parent->getValue() << std::endl;
}
};

typedef boost::shared_ptr<Collector> CollectorPtr;

ParentAPtr createParentA()
{
return ParentAPtr(new ParentA());
};

BOOST_PYTHON_MODULE(hello)
{
boost::python::class_<Base, BasePtr, boost::noncopyable>("Base",
        boost::python::no_init)
        .def("getValue", &Base::getValue)
;

boost::python::class_<ParentA, ParentAPtr, boost::python::bases<Base>>("ParentA")
;

boost::python::implicitly_convertible< ParentAPtr, BasePtr >();

boost::python::def("createParentA", createParentA);

boost::python::class_<Collector, CollectorPtr>("Collector")
    .def("addParent", &Collector::addParent)
;
}

Пример кода для тестирования в консоли Python:

import hello
p = hello.createParentA()
c = hello.Collector()
c.addParent(p)

Исходное сообщение с фальшивкойcode:

У меня возникли проблемы с использованием Boost Python для выгрузки файла shared_ptr из Python.

class Base() {...};
class ParentA(): public Base {...};
class ParentB(): public Base {...};

typedef boost::shared_ptr<Base> BasePtr;
typedef boost::shared_ptr<Parent> ParentPtr;

class Collector() 
{
  void addParent(BasePtr& parent) {...}
}
typedef boost::shared_ptr<Collector> CollectorPtr;

BOOST_PYTHON_MODULE(PythonModule)
{
 boost::python::class_<Collector, CollectorPtr>("Collector")
  .def("addParent", &Collector::addParent)


 boost::python::class_<Base, BasePtr, boost::noncopyable>("Base", 
            boost::python::no_init)
 ...
 ;

 boost::python::class_<ParentA, ParentAPtr, 
            boost::python::bases<Base>>("ParentA", 
        boost::python::init<>())
 ...
 ;

 boost::python::implicitly_convertible< ParentAPtr, BasePtr >();
}

И в Python мы делаем:

from PythonModule import *
p = ParentA()
c = Collector()
c.addParent(p) # Fails here because no upcast is happening. 

Любые идеи о том, как я могу сделать эту работу?

Скомпилировано на VS2008 с BOOST 1.44 и Python 3.0.

Спасибо,

Ответы [ 2 ]

1 голос
/ 19 октября 2010

Хорошо ... при подготовке реального примера кода я предложил решение. Проблема в Collector.addParent (BasePtr & parent). Кажется, что Boost Python не любит, чтобы это было ссылкой. Изменение в Collector.addParent (родительский BasePtr) исправляет это. Спасибо за внимание.

0 голосов
/ 14 марта 2014

Попробуйте Collector.addParent (const BasePtr & parent)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...