передача простого указателя без владения для повышения Python

Я делаю первые шаги с 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

1

Решение

Первая проблема с вашим примером заключается в том, что 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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]