将对象数组的引用传递给函数

Pass reference of array of objects to function

我正在尝试更改数组中对象的参数,但当我将它传递给函数时它似乎正在创建一个新参数。

我已经看到类似的问题和答案this one,但它对我不起作用,因为我没有固定的数组大小最终代码。

我创建了一个非常短的代码版本来显示问题。

#include <iostream>

using namespace std;

class Vect {
public:
    Vect(int x, int y)
    {
        _x = x;
        _y = y;
    }

    int _x;
    int _y;
};

void ChangeX(Vect tests[], int size)
{
    for (int i = 0; i < size; i++) {
        tests[i]._x = 39;
    }
}

int main()
{

    Vect v1 = Vect(1,2);
    Vect v2 = Vect(6,3);
    cout << "Initial X: ";
    cout << v1._x;
    cout << "\n";

    Vect vectors[2] = { v1, v2 };

    cout << "Final X: ";
    ChangeX(vectors, 2);
    cout << v1._x;

    return 0;
}

我希望输出为:

Initial X: 1
Final X: 39

但实际上是:

Initial X: 1
Final X: 1

此外,使用 C++ 向量目前不是解决方案。我 运行 程序内存使用率低,并且有一个非常小的 space 用于额外代码。

您的问题与您的功能无关。它正在正确更新数组的内容。不需要通过引用传递数组本身。

真正的问题是数组本身。语句 Vect vectors[2] = {v1, v2}; 使数组中 v1v2 对象的 副本 。您的函数正在修改 copies,然后您从 originals 而不是 copies 输出值.所以,你的输出没有改变,因为函数没有修改 originals.

要完成您的尝试,请传入一个指针数组,其中指针指向 原始 对象,而不是 副本 其中,例如:

#include <iostream>

class Vect {
    public:
        Vect(int x, int y){
            _x = x;
            _y = y;
        };
        int _x;
        int _y;
};

void ChangeX(Vect* tests[], int size){
    for(int i = 0; i < size; i++){
        tests[i]->_x = 39;
    }
}

int main()
{
    Vect v1(1,2);
    Vect v2(6,3);

    std::cout << "Initial X:\n";
    std::cout << v1._x << "\n";
    std::cout << v2._x << "\n";
    
    Vect* vectors[2] = {&v1, &v2};    
    ChangeX(vectors, 2);

    std::cout << "Final X:\n";
    std::cout << v1._x << "\n";
    std::cout << v2._x << "\n";

    return 0;
}

Live Demo

否则,从一个数组开始,例如:

#include <iostream>

class Vect {
    public:
        Vect(int x, int y){
            _x = x;
            _y = y;
        };
        int _x;
        int _y;
};

void ChangeX(Vect tests[], int size){
    for(int i = 0; i < size; i++){
        tests[i]._x = 39;
    }
}

int main()
{
    Vect vectors[2] = {Vect(1,2), Vect(6,3)};

    std::cout << "Initial X:\n";
    std::cout << vectors[0]._x << "\n";
    std::cout << vectors[1]._x << "\n";
    
    ChangeX(vectors, 2);

    std::cout << "Final X:\n";
    std::cout << vectors[0]._x << "\n";
    std::cout << vectors[1]._x << "\n";

    return 0;
}

Live Demo