1

クラスをテストするために最初のステップを進めboost pythonていますが、クラスの python モジュールを宣言する際に問題に直面しています。

私のクラスは別のクラスへのポインターを受け入れますが、宣言する方法がわかりません

class A{ };

class B
{
    B( std::string& name, A* ptr ){ 
        std::cot << ptr->data << std::endl; // no ownership
    }
    void my_foo(){
        // do something!
    }
};

クラス A を python にエクスポートしましたが、クラス B で問題に直面しています

class_< B >("B", init< std::string, A >() )
{
    .def("my_foo", &B::my_foo);   
}

私はたくさんのエラーを抱えています。私が間違っていることは何ですか?私はポリシーについて読んでいますが、ここではそれらのいくつかを適用する必要はないと思いますよね?

敬具

AFG

4

1 に答える 1

5

あなたの例の最初の問題は、boost::python::class_ボディが中かっこの中に入れられないことです-それらはマクロや新しい種類の関数ではなく、多くの派手な演算子のオーバーロードを持つ単なるテンプレートクラスであるため、本当に欲しいのは何かですこのような:

class_<B>("B", init<std::string,A*>())
    .def("my_foo", &B::my_foo)
    ;

そのスニペットでは、init をコンパイルするために必要な修正を確認できます。'A A*' の代わりにテンプレート パラメーターとして渡すだけです。コンパイルするにはそれで十分なはずです。

それがあなたが望むことをするのに十分かどうかは、コンストラクターBが渡されたポインターで何をするかによって異なります。コンストラクターのスコープ内で単純に使用するか、ディープコピーする場合は問題ありません。しかし、そのポインターを保持している場合 (たとえば、データ メンバーとして)、Aオブジェクトが範囲外になる前にBオブジェクトが範囲外になると、問題が発生する可能性があります。その場合は、次のwith_custodian_and_wardようなポリシーを使用することをお勧めします。

init<std::string,A*>()[with_custodian_and_ward<1,3>()]

with_custodian_and_wardメソッドへの位置引数を参照する整数テンプレート引数__init__1を参照しself、引数を3参照するA*ため、これは「構築されたオブジェクトが破棄さAれるまで、コンストラクタに渡されたオブジェクトを存続させる」ことを意味します。B

詳細については、次を参照してください。

http://www.boost.org/doc/libs/1_52_0/libs/python/doc/v2/with_custodian_and_ward.html

于 2013-01-05T18:44:52.963 に答える