Присвойте значение переменной члена класса в python из c ++ с boost python - PullRequest
0 голосов
/ 21 мая 2018

У меня есть класс C ++, который доступен для python с фреймворком boost python.

    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?

1 Ответ

0 голосов
/ 22 мая 2018

Вы можете изменить свой код на 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
...