Фабрика, возвращающая форсированные обнаруженные ошибки сегмента объекта Python

У меня злая проблема с раскрытием полиморфной иерархии классов через фабрику. Я создал пример, который демонстрирует проблему.

Все это размещается в исполняемом файле со встроенным интерпретатором Python (2.7 без стека). Когда я запускаю исполняемый файл и получаю код Python, я могу создать переменную из фабрики (a = MakeB ()), которая возвращает умный указатель на класс TestA, но содержит экземпляр TestB. У меня проблема в том, что когда я обращаюсь к переменным / функциям члена базового класса, это работает, но при обращении к переменным / функциям TestB генерируется ошибка сегмента 11 (osx).

Возвращенный экземпляр сообщает Python, что его класс — TestB (учебный класс сообщает то же самое) и сообщения печати показывают, что TestB был создан и возвращен. Следует отметить, что именно я создаю TestB напрямую (в отличие от фабрики), переменные / функции базового класса работают правильно.

Мой действительный производственный код более сложен, но это сводило его к этому тестовому примеру. Я могу предоставить обратный след segfault, если кто-то думает, что это поможет.

Благодарю.

>print sys.version
2.7.6a1 Stackless 3.1b3 060516 (default, Jan 10 2014, 13:13:51)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)]

файл hpp

class TestA;
typedef boost::shared_ptr<TestA> TestAPtr;
class TestB;
typedef boost::shared_ptr<TestB> TestBPtr;
class TestA
{
public:

TestA();
virtual ~TestA();
static void Boost(void);
string Aprop;
void FuncA();

};

class TestB : public TestA
{
public:

TestB();
virtual ~TestB();
static void Boost(void);
string Bprop;
void FuncB();
};

файл cpp

TestA::TestA() : Aprop("Test A")
{
printf("Create TestA\n");
}
TestA::~TestA()
{
printf("Destroy TestA\n");
}
void TestA::Boost(void)
{
class_< TestA >("TestA", init<>())
.def("FuncA", &TestA::FuncA)
.def_readwrite("Aprop", &TestA::Aprop)
;
register_ptr_to_python< boost::shared_ptr<TestA> >();
}
void TestA::FuncA()
{
printf("Hi From Test A\n");

}

// ------ Test B

TestB::TestB() : TestA(), Bprop("Test B")
{
printf("Create TestB\n");
}

TestB::~TestB()
{
printf("Destroy TestB\n");
}
void TestB::Boost(void)
{
class_< TestB, bases<TestA> >("TestB", init<>())
.def("FuncB", &TestB::FuncB)
.def_readwrite("Bprop", &TestB::Bprop)
;
register_ptr_to_python< boost::shared_ptr<TestB> >();
}
void TestB::FuncB()
{
printf("Hi From Test B\n");
}

// Factory...
TestAPtr MakeB()
{
return boost::shared_ptr<TestA>(new TestB());
}

BOOST_PYTHON_MODULE(__builtin__)
{
TestA::Boost();
TestB::Boost();

def("MakeB", MakeB);
}

1

Решение

Задача ещё не решена.

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

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

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