次のように定義された2つのboost pythonモジュールがあるとします。モジュールA:Boost Pythonにおけるモジュール間の依存関係
class SomeClass {
public:
SomeClass() {}
~SomeClass() {}
};
BOOST_PYTHON_MODULE(A)
{
class_<SomeClass>("SomeClass");
}
、モジュールB:
class AnotherClass {
public:
AnotherClass() {}
~AnotherClass() {}
void func(SomeClass& sp) {}
};
BOOST_PYTHON_MODULE(B)
{ class_<AnotherClass>("AnotherClass")
.def("func", &AnotherClass::func)
;
}
モジュールBは、モジュールAに依存する(すなわち、それは、モジュールAからSomeClass
を使用)を有しています。 Pythonは自動的にモジュール間のクラスを変換しないようだ
Traceback (most recent call last):
File "C:\bladiebla\script.py", line 8, in <module>
obj2.func(obj1)
ArgumentError: Python argument types in
AnotherClass.func(AnotherClass, SomeClass)
did not match C++ signature:
func(class AnotherClass {lvalue}, class SomeClass)
:
import A
import B
obj1 = A.SomeClass()
obj2 = B.AnotherClass()
obj2.func(obj1)
私は次のエラーを取得する:今、私は次のPythonスクリプトを実行します。誰かがこれを解決するためのアイデアを持っていますか?
こんにちは、どうもありがとうございました。しかし、私は継承関係のない2つのクラスについてこの問題を解決したいと思います。たとえば、 'SomeClass'は実際には 'Triangle'クラスで、 'AnotherClass'は 'Polygon'クラスであると想像できます。私は間違いなくPolygonがTriangleから継承しないようにしたいと思います。OOの観点からは意味をなさないからです。ですから、私は元の例のように、互いに継承していない異なるモジュールに2つのクラスを持たせることができますが、それらはPythonでお互いを使用していますか? – Arjan
'func()'は 'SomeClass'引数を必要とします。 'AnotherClass'のように別のものを渡したいならば、AnotherClass'を引数として' SomeClass'にコンストラクタを追加することによって 'AnotherClass'を' SomeClass'から継承させることなく**することができます。代わりに、 'AnotherClass'引数を受け入れ、' SomeClass'インスタンスを返したものを書くこともできますが、明示的に呼び出す必要があります。そのようなことをすることができない場合、私はあなたが立ち往生していると思っています - とにかく 'func()'とは何か、何も知らない任意のクラスを渡せば? – martineau
はい、私は理解していますが、この関数と異なる何かを渡したくない、SomeClass型の引数だけを渡したいと思います。 Pythonスクリプトの例では、私のobj1はA.SomeClass型です。 B.AnotherClassとは無関係です。 B.AnotherClassの 'func'は、obj1などのA.SomeClass型のパラメータを受け入れる必要があります。 – Arjan