CPP:
#include <boost/python.hpp>
using namespace boost;
using namespace boost::python;
struct Foo
{
virtual ~Foo() {}
virtual void Print() = 0;
};
struct FooWrap : Foo, wrapper<Foo>
{
void Print()
{
this->get_override("Print")();
}
};
void ProcessFoo(Foo *obj) { obj->Print(); }
BOOST_PYTHON_MODULE(hello_ext)
{
class_<FooWrap, boost::noncopyable>("Foo")
.def("Print", pure_virtual(&Foo::Print));
def("ProcessFoo", &ProcessFoo);
}
蟒:
import hello_ext
class NewFoo(hello_ext.Foo):
def Print(self):
print 'Print call'
hello_ext.ProcessFoo( NewFoo() )
一切正常,Print call
来自ProcessFoo
来自ProcessFoo
的文字。但是我希望将所有传递的指针存储到std::vector<Foo*> data;
void ProcessFoo(Foo *obj) { data.push_back(obj); obj->Print(); }
,如:
{{1}}
退出函数指针后变为无效,我无法从向量中使用它。使指针的生命周期更大的最佳方法是什么?使用共享指针或告诉python不要删除对象(如果删除它?)
答案 0 :(得分:2)
如果要存储此指针,则必须增加其底层python对象(PyObject)的引用计数。为此,你必须实现你的void ProcessFoo(Foo * obj)来获取一个python对象而不是C ++对象,因为否则boost :: python将在你的自适应中为你剥离python对象,你无法控制它的生命周期。 / p>
如果你这样做,你还必须明确地转换为C ++类型(但是使用boost :: python这不是很麻烦)。
using namespace boost::python;
std::vector< std::pair<object, Foo&> > myVec;
void ProcessFoo(object o )
{
Foo& x = extract<Foo&>(o);
// ... do you add to container here, but remember, to add the object o
// too, otherwise the refernce counter will be decremented and the object
// may go away.
myVec.push_back( std::make_pair( o, x ) );
}