2010-03-17 6 views
3

Considérez quelque chose comme:passe par référence dans Boost :: Python

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

Eh bien, nous allons avancer rapidement, et imaginez je l'ai déjà enveloppé ces classes, ce qui expose tout à python, et imaginez aussi que j'instancier un objet de paramètre dans le code C++, que je passe au script python, et ce script python utilise un objet MyClass pour modifier l'instance du paramètre I créé au début dans le code C++. Après l'exécution de ce code, l'instance de paramètre C++ est inchangée. Cela signifie qu'il a été passé par valeur (ou quelque chose de semblable: S), pas par référence. Mais je pensais l'avoir déclaré par référence ...

Je n'arrive pas à trouver la documentation Boost :: Python sur le passage par référence (bien qu'il semble y avoir assez de doc pour revenir par référence ...) . Quelqu'un peut-il donner un indice ou un pointeur s'il vous plaît?

+2

Après avoir ajouté un point-virgule dans votre constructeur pour le paramètre, ce code de test a bien fonctionné pour moi: http://www.pastie.org/873263 –

+1

@Goose, La question concerne l'utilisation de ce code de Python, pas de C++. –

+0

@Barry mhm. Ce fut juste un exemple rapidement inventé. – Fabzter

Répondre

1

Python n'a pas de références, donc quand vous passez référence à python boost::python appelle copy-ctor de votre objet.

Dans ce cas, vous avez deux choix: Remplacer les références par des pointeurs (ou des pointeurs intelligents) ou passez dans python votre propre objet/encapsuleur 'smart-reference'.

+0

Dans mon projet, je résous le même problème en créant un vecteur intelligent qui ne copie pas de données dans copy-ctor, mais partage un pointeur vers des données. – W55tKQbuRu28Q4xv

+0

Merci! J'aide, mais je pensais que python gérait tout avec des références? – Fabzter

+0

Peut-être que je me trompe, mais des références python comme des pointeurs C++, pas des références. – W55tKQbuRu28Q4xv

Questions connexes