Присвойте значение переменной члена класса в python из c ++ с boost python

У меня есть класс C ++, который подвергается воздействию Python с помощью Boost Python Framework.

    struct Var
{
Var(std::string name) : name(name), value() {}
std::string const name;
float value;
};

BOOST_PYTHON_MODULE(hello)
{
class_<Var>("Var", init<std::string>())
.def_readonly("name", &Var::name)
.def_readwrite("value", &Var::value);
;
}

Ниже приведен скрипт Python, использующий этот класс:

x = hello.Var("hello")
def print_func():
print(x.value)

Возможно ли получить доступ к объекту x внутри кода C ++ и назначить value переменная-член значение в C ++, которое печатается, когда print_func() выполняется в скрипте Python?

0

Решение

Вы можете изменить свой код на Python и C ++, как показано ниже

//I hope you are expecting some functionality like below

class Var
{
public:
Var(std::string name) : name(name), value() {}
std::string const name;
double value;
void set_value();
double get_value();
};

Var::set_value(double value)
{
this->value = value;
}

double Var::get_value(){

return this->value;
}

// c++ Var class constructor caller
Var* var_constructor_caller(string name){

return new Var(name);
}

BOOST_PYTHON_MODULE(hello_ext)
{
//class_<Var>("Var", init<std::string>())
class_<Valr>("Var") // this line is for c++ class not exposed to python
.def("set_value", &Var::set_value)
.def("get_value", &Var::get_value)
.def_readonly("name", &Var::name)
.def_readwrite("value", &Var::value);
;

def("var_constructor_caller", var_constructor_caller, return_value_policy<manage_new_object>());
// by <manage_new_object> return type you are giving owner ship to python to delete the object
}

Ниже приведен скрипт Python, использующий этот класс:

import hello_ext as hello
var_obj = hello.var_constructor_caller("myname")
var_obj.set_value(3.14)
value = var_obj.get_value()
print value
var_object.value = 5.75 #you call directly assign value also to c++ class data member
print value
0

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

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

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