更改派生 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);
}

但是当我尝试在单元格中使用 rightsetX 更改 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& 以避免额外的副本。