通过引用传递对象

Passing Objects by reference

本文关键字:对象 引用      更新时间:2023-10-16

(我没有找到我想要的答案,但我自己想办法,所以我想尝试为将来可能有它的其他人回答我自己的问题(

如何将对象传递给非类函数并更改其数据?例如

class Foo{} 有一个私有的 int x = 5,我想在不直接从类输入 changeValue 函数的情况下将其更改为 10,但使用非类函数来调用此函数。

因此,

如果您的代码看起来像这样:

class Foo {
public:
    void changeValue(int val) { x = val; }
private:
    int x;
}

并且您想在 changeValue 方法之外更改 x,您需要做的就是添加您想要将其作为朋友更改为 Foo 类的函数。因此,例如,要使其正常工作:

void g(Foo& foo) {
   foo.x = 10;
}

您必须将以下行添加到 Foo 类中:

friend void g(Foo& foo);

将类中的某些内容声明为好友允许该函数/类访问私有成员和方法。

假设我们有

class Foo{
private:
    int x;
public:
    change(int y){
        x = y;
    }
}

我们想要这个功能

void changeVal(Foo test, int num);

以更改 X 而不是

Foo::change(int y);

我们会给我们的 changeVal 函数对象地址

int main(){
    Foo test;
    changeVal(&test, 5);   
}

然后我们将创建 changeVal 并创建一个指针对象来保存我们原始对象的地址

void changeVal(Foo* test, int num){
    ...
}

在正文中,我们需要创建第三个对象来获取原始对象的值,因此我们给它存储在"Foo* 测试"中的地址,并使用原始对象的地址更改新对象的值,因此我们正在更改原始对象而不是副本

void changeVal(Foo* test, int num){
    Foo test2 = &test;
    test2.change(num);
}