更改派生类对象的字段,但返回后更改已恢复
Posted
技术标签:
【中文标题】更改派生类对象的字段,但返回后更改已恢复【英文标题】:Change the field of a derived class object but the change was recovered after returning 【发布时间】:2021-10-07 07:05:25 【问题描述】:我重写了create
函数。
void IBlock::create()
Cell a;
a.setCoords(0, 3);
a.setblank(false);
Cell b;
b.setCoords(1, 3);
b.setblank(false);
Cell c;
c.setCoords(2, 3);
c.setblank(false);
Cell d;
d.setCoords(3, 3);
d.setblank(false);
vector<Cell> row2;
row2.push_back(a);
row2.push_back(b);
row2.push_back(c);
row2.push_back(d);
block.push_back(row2);
但是当我尝试在单元格中使用right
和setX
更改IBlock
的坐标并输出它们的坐标时,
void Board::right()
bool movable = true;
if (getCurrent() == nullptr)
return;
for (auto ro : getCurrent()->block)
int x = ro.back().getX() + 1;
int y = ro.back().getY();
if (x >= col || (board[y][x]))
movable = false;
if (movable)
for (auto ro : getCurrent()->block)
for (auto co : ro)
int x = co.getX();
int y = co.getY();
board[y][x] = false;
for (auto ro : getCurrent()->block)
for (auto co : ro)
co.setX(co.getX() + 1);
int x = co.getX();
int y = co.getY();
board[y][x] = true;
cout << x << y << "!";
void Cell::setX(int a)
this->x = a;
我得到的坐标是13!23!33!43!
。
但是当我在main中取回坐标时,我得到的坐标是03!13!23!33!
,就像移动前的坐标一样?
我怎样才能不更改坐标?非常感谢!!
【问题讨论】:
您能否显示minimal reproducible example,每个人都可以剪切/粘贴完全如图所示,编译、运行和重现您的问题?对于不知道该程序其余部分的人来说,显示的两块代码意义不大。这种问题可能有多种原因,所以如果没有minimal reproducible example,没有人可以帮助您。 【参考方案1】:for (auto co : ro)
复制每个迭代的对象渲染调用,如co.setX()
无用。这就像按值传递参数。如果您需要循环(函数)来改变可迭代的元素(参数),请将它们绑定到引用循环变量(参数)。
使用for (auto& co : ro)
,详情请参阅this answer。
for (auto ro : getCurrent()->block)
循环也是如此,使用 const auto&
来避免额外的副本。
【讨论】:
以上是关于更改派生类对象的字段,但返回后更改已恢复的主要内容,如果未能解决你的问题,请参考以下文章