多くのクラスを使用する C++ プロジェクトがあります。主なクラスは ' sso::Object
' (すべてのクラスは 'sso' 名前空間にあります) で、このクラスは他のいくつかのクラスに派生しますが、抽象クラスは ' sso::Drawable
' です。
sso::Drawable::set_opacity
このクラスには ' ' と ' ' の2 つの純粋仮想メソッドがあり、これら 2 つのメソッドを実装するsso::Drawable::raw_draw
' ' などの他のクラスに派生します。sso::View
C++ で使用するとプロジェクト全体が正常に動作しますが、Python でも使用したいので、次のような Boost.Python モジュールを作成しました。
class DrawableWrapper : public sso::Drawable , public wrapper<sso::Drawable> {
public:
void set_opacity(byte opacity) { this->get_override("set_opacity")(opacity); }
void raw_draw(const sso::Rect &rect,sso::Target &target,const sso::Position &position) const {
this->get_override("raw_draw")(rect,target,position);
}
};
BOOST_PYTHON_MODULE(sso) {
class_<DrawableWrapper,boost::noncopyable> ("Drawable",init<>())
.add_property ("opacity",&sso::Drawable::get_opacity)
// python_sso_getter & python_sso_setter_* are only used for an easier access to accessors
.add_property ("position",python_sso_getter<sso::Drawable,sso::Position,&sso::Drawable::get_position>,python_sso_setter_1_const<sso::Drawable,sso::Position,&sso::Drawable::set_position>)
.def("raw_draw",pure_virtual(&sso::Drawable::raw_draw))
;
class_<sso::View,bases<sso::Drawable> > ("View",init<>())
.def("insert",python_sso_setter_1<sso::View,sso::Drawable*,&sso::View::insert>)
.def("remove",&sso::View::erase)
;
}
このコードはエラーなしでコンパイルされますが、Python でこれらの行を実行すると:
myview = sso.View()
print myview
私はこの出力を得る:
<0x7f9d2681a4b0 の sso.View オブジェクト>
しかし、私の C++ デバッガーは、変数 'v' (python 'myview') は ' sso::Object
' インスタンスであり、' ' インスタンスではないことを教えてくれますsso::View
。sso::View::View()
が呼び出されますが、変数の型はビューではなく、理由がわかりません。それについて何か考えはありますか?あなたはそのようなことをして、それを機能させる方法を見つけましたか?
私は Python2.7 と Boost.Python1.49 と gcc バージョン 4.6.1 を使用しています
編集: 私は間違いを犯しました:sso::Drawable
は から継承しませんsso::Object
が、sso::View
(=多重継承) は継承します。