【问题标题】:Pass reference of array of objects to function将对象数组的引用传递给函数
【发布时间】:2020-07-15 22:05:15
【问题描述】:

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

我已经看到类似的问题和答案,例如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++ 向量不是解决方案。我的程序内存使用率很低,用于额外代码的空间非常小。

【问题讨论】:

  • ChangeX(vectors, 2); -- 您正在更改 vectors,而不是 v1v2。改为打印vectors[0]._x
  • 不相关:潜在的术语问题Vect 看起来更像是一个点而不是一个向量。

标签: c++ arrays arduino arduino-c++


【解决方案1】:

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

真正的问题在于数组本身。语句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;
}

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

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多