我有一个使用很多类的 C++ 项目。主要的是' sso::Object
'(每个类都在'sso'命名空间中),这个类派生到其他一些类,但一个是抽象的:' sso::Drawable
'。
这个类有两个纯虚方法' sso::Drawable::set_opacity
'和' 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
我得到这个输出:
<sso.View 对象位于 0x7f9d2681a4b0>
但是我的 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
确实(=多重继承)。