Boost.python и указатели

Приветствую. Есть такой код:

class Foo()
{
   virtual void Print() = 0;
};

struct FooWrap : Foo, bp::wrapper<Foo>
{
    void Print()
    {
        this->get_override("Print")();
    }

void ProcessFoo(Foo *obj) { obj->Print(); }

    // Экспорт
    bp::class_<FooWrap, boost::noncopyable>("Foo")
        .def("Print", bp::pure_virtual(&Foo::Print))
    bp::def("ProcessFoo", &ProcessFoo);


У меня есть базовый класс, я экспортирую его в python через библиотеку boost.python. Также есть фукнция, которая принимает указатель на этот класс.

Когда я пытаюсь сделать такое в питоне:

class NewFoo(Foo):
   def Print():
      print 'Print call'

ProcessFoo( NewFoo() )


Сегфолт — дебаггер показывает, что падает на вызове функции Print.

Логично предположить, что на стороне с++ уже невалидный указатель, скорее всего. Может нужно как-то указать через policy что-то? Или банально нельзя передать объект класса как чистый указатель в с++?
  • Вопрос задан
  • 3867 просмотров
Решения вопроса 1
Wyrd
@Wyrd
Архитектор
Честно говоря, никогда не пользовался этой штуковиной, но ради интереса решил попробовать.
И… все заработало (с учетом мелких поправок кода для «компилябельности»).

hello.cpp:
#include <boost/python.hpp>
 
using namespace boost;
using namespace boost::python;
 
struct Foo
{
   virtual ~Foo() {}
   virtual void Print() = 0;
};
 
struct FooWrap : Foo, wrapper<Foo>
{
    void Print()
    {
        this->get_override("Print")();
    }
};
 
void ProcessFoo(Foo *obj) { obj->Print(); }
 
BOOST_PYTHON_MODULE(hello_ext)
{
    class_<FooWrap, boost::noncopyable>("Foo")
        .def("Print", pure_virtual(&Foo::Print));
    def("ProcessFoo"&ProcessFoo);
}


hello.py:
import hello_ext
 
class NewFoo(hello_ext.Foo):
   def Print(self):
      print 'Print call'
 
hello_ext.ProcessFoo( NewFoo() )


Запуск:
E:Temppython>"d:/Coding/Python 2.7/python.exe" hello.py
Print call


Тех. данные:
boost 1.43
MSVS 2010 SP1
python 2.7
компилировалось с помощью bjam
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Wyrd
@Wyrd
Архитектор
Предположение: цепляется не та либа-переходник (имеется в виду что-то вроде boost_python-vc100-mt-gd-1_43.dll). Возможно, у вас ее имя без версии (можно так буст настроить)? возможно вы обновили буст а либу не пересобрали?

Предположение 2 (сомнительное): С++ часть скомпилирована не под тот питон, которым запускают?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы