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

Pass reference of array of objects to function

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

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

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

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

#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++向量目前还不是解决方案。我的程序内存使用率很低,而且用于额外代码的空间很小。

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

真正的问题是数组本身。语句Vect vectors[2] = {v1, v2};使复制数组中的v1v2对象。您的功能是修改副本,然后从原件输出值,而不是拷贝。因此,您的输出不会改变,因为函数不会修改原始

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

#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;
}

实时演示

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

#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;
}

实时演示