更改派生 class 对象的字段,但更改在返回后恢复
Change the field of a derived class object but the change was recovered after returning
我覆盖了 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!
就像移动之前的坐标一样?
我怎样才能让坐标保持不变?非常感谢!!
for (auto co : ro)
使每个迭代对象渲染调用的副本如 co.setX()
无用。这就像按值传递参数。如果您需要循环(函数)来改变可迭代的元素(参数),请将它们绑定到引用循环变量(参数)。
使用 for (auto& co : ro)
,请参阅 this answer 了解更多详情。
同样适用于 for (auto ro : getCurrent()->block)
循环,使用 const auto&
以避免额外的副本。
我覆盖了 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!
就像移动之前的坐标一样?
我怎样才能让坐标保持不变?非常感谢!!
for (auto co : ro)
使每个迭代对象渲染调用的副本如 co.setX()
无用。这就像按值传递参数。如果您需要循环(函数)来改变可迭代的元素(参数),请将它们绑定到引用循环变量(参数)。
使用 for (auto& co : ro)
,请参阅 this answer 了解更多详情。
同样适用于 for (auto ro : getCurrent()->block)
循环,使用 const auto&
以避免额外的副本。