ファクトリを介してポリモーフィックなクラス階層を公開する際に厄介な問題が発生しています。問題を示す例を作成しました。
これはすべて、Python(スタックレス 2.7) インタープリターが組み込まれた実行可能ファイルでホストされています。実行可能ファイルを実行して Python コードを取得すると、ファクトリ (a = MakeB()) から変数を作成できます。これは、TestA クラスへのスマート ポインターを返しますが、TestB のインスタンスを保持します。私が抱えている問題は、基本クラスのメンバー変数/関数にアクセスすると機能するが、TestB 変数/関数にアクセスするとセグメント フォールト 11 (osx) が生成されることです。
返されたインスタンスは、そのクラスが TestB であることを python に報告し (クラスは同じことを報告します)、出力メッセージは、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);
}