views:

250

answers:

1

Hi everybody. Consider something like:

struct Parameter
{
    int a;
    Parameter(){a = 0;}
    void setA(int newA){a = newA;}
};
struct MyClass
{
    void changeParameter(Parameter &p){ p.setA(-1);}
};

Well, let's fast forward, and imagine I already wrapped those classes, exposing everything to python, and imagine also I instantiate an object of Parameter in the C++ code, which I pass to the python script, and that python script uses a MyClass object to modify the instance of Parameter I created at the beginning in the C++ code.

After that code executes, in C++ Parameter instance is unchanged!!! This means it was passed by value (or something alike :S), not by reference. But I thought I declared it to be passed by reference...

I can't seem to find Boost::Python documentation about passing by reference (although there seems to be enough doc about returning by reference...). Can anyone give some hint or pointer please?

+1  A: 

Hmm, first - python doesn't have references, so when you pass reference to python boost::python calls copy-ctor of you object. In this case you have two choices - replace references with points (or smart-pointers) or pass to python you own 'smart-reference' object/wrapper.

W55tKQbuRu28Q4xv
In my project I solve same issue by creating a smart vector which doesn't copy a data in copy-ctor, but share a pointer to data.
W55tKQbuRu28Q4xv
Thank you!! I helps, but I thought python managed everything with references?
Fabzter
May be I'm wrong but python references like c++ pointers, not references.
W55tKQbuRu28Q4xv