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

dri*_*max 2 c++ arrays arduino arduino-c++

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

我已经看到了类似的问题和答案,这一个,但它不为我工作,因为我没有在最后的代码固定的数组的大小。

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

我希望输出是:

Initial X: 1
Final X: 39
Run Code Online (Sandbox Code Playgroud)

但实际上是:

Initial X: 1
Final X: 1
Run Code Online (Sandbox Code Playgroud)

此外,目前使用 C++ 向量不是解决方案。我的程序内存使用率很低,并且用于额外代码的空间非常小。

Rem*_*eau 7

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

真正的问题在于数组本身。该声明Vect vectors[2] = {v1, v2};使副本v1v2数组中的对象。您的函数正在修改副本,然后您从原件而不是副本输出值。因此,您的输出不会改变,因为该函数不会修改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;
}
Run Code Online (Sandbox Code Playgroud)

现场演示

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

现场演示