Я делаю первые шаги с 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
Первая проблема с вашим примером заключается в том, что 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
Других решений пока нет …