【发布时间】:2017-09-25 08:58:59
【问题描述】:
我在here 上阅读了一个类似的问题,即按值传递将在您的函数中创建对象的本地副本。当我尝试这样做时,我的原始对象被改变了,但我不希望它改变。
此测试的目标是尝试传递一个对象,在本地对其进行更改,但保持原件不变。
在ObjectList头文件中:
int **board;
ObjectLise 类包含一个构造函数和一个打印函数:
ObjectList::ObjectList()
{
board = new int*[9];
for(int i = 0; i < 9; i++)
{
board[i] = new int[9];
}
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
board[i][j] = 10;
}
}
}
void ObjectList::printB()
{
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
cout << board[i][j] << ",";
}
cout << endl;
}
}
具有通过 ObjectList 传递的函数的 ChangeBoard 类。
void ChangeBoard::LetsChange(ObjectList layout)
{
layout.board[0][0] = 99;
layout.board[1][0] = 99;
layout.board[2][0] = 99;
layout.board[3][0] = 99;
layout.board[4][0] = 99;
layout.board[5][0] = 99;
}
我主要创建两个对象并将 ObjectList 对象传递给 LetsChange 函数以尝试仅在本地更改对象,即仅在函数中:
ObjectList object = ObjectList();
ChangeBoard change = ChangeBoard();
object.printB();
change.LetsChange(object);
cout << endl;
object.printB();
输出显示原始对象被更改:
10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
99,10,10,10,10,10,10,10,10,
99,10,10,10,10,10,10,10,10,
99,10,10,10,10,10,10,10,10,
99,10,10,10,10,10,10,10,10,
99,10,10,10,10,10,10,10,10,
99,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
10,10,10,10,10,10,10,10,10,
【问题讨论】:
-
对象没有被修改,但是
board指向的数据会被修改。我建议您阅读有关the rules of three, five and zero 的内容,并停止对数组或向量使用指针。 -
您的问题缺少minimal reproducible example,但看起来
ObjectList的复制构造函数已损坏。 -
投票关闭,因为缺乏可重复的例子。
-
假设您没有明确定义一个,我认为您需要查找复制构造函数行为en.cppreference.com/w/cpp/language/copy_constructor
-
据我了解,您只能返回指向数组的指针,而不能返回静态数组。这就是我选择使用指针的原因。
标签: c++