sbunny
sbunny

Reputation: 439

Assign value to a class member variable in python from c++ with boost python

I have a C++ class that is exposed to python with 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);
       ;
    }

Below is the python script using this class:

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

Is it possible to access the object x inside C++ code and assign the value member variable a value in c++ that is printed when print_func() is executed in the python script ?

Upvotes: 1

Views: 1443

Answers (1)

HarshGiri
HarshGiri

Reputation: 408

You can change your python and c++ code, as below

//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
}

Below is the python script using this class:

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

Upvotes: 1

Related Questions