将对象数组的引用传递给函数
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};
使数组中 v1
和 v2
对象的 副本 。您的函数正在修改 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;
}
否则,从一个数组开始,例如:
#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;
}
我正在尝试更改数组中对象的参数,但当我将它传递给函数时它似乎正在创建一个新参数。
我已经看到类似的问题和答案像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};
使数组中 v1
和 v2
对象的 副本 。您的函数正在修改 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;
}
否则,从一个数组开始,例如:
#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;
}