在Boost::Python中通过引用传递

4 投票
1 回答
3272 浏览
提问于 2025-04-15 20:30

想象一下这样的情况:

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

好吧,假设我已经把那些类包装好了,让它们可以在Python中使用。然后我在C++代码中创建了一个Parameter对象,并把它传给了Python脚本。这个Python脚本又用一个MyClass对象来修改我在C++代码中最开始创建的Parameter实例。

但是,当这段代码执行完后,C++中的Parameter实例却没有任何变化!!!这意味着它是按值传递的(或者类似的方式 :S),而不是按引用传递的。但我明明是想让它按引用传递的……

我找不到关于Boost::Python中按引用传递的文档(虽然关于按引用返回的文档似乎有不少)。有没有人能给我一些提示或者指引呢?

1 个回答

2

Python没有引用的概念,所以当你把一个引用传给Python时,boost::python会调用你对象的复制构造函数,也就是会创建一个对象的副本。

在这种情况下,你有两个选择:要么用指针(或者智能指针)来替代引用,要么把你自己定义的“智能引用”对象或包装器传给Python。

撰写回答