更改派生类对象的字段,但返回后更改已恢复

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);

但是当我尝试在单元格中使用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!,就像移动前的坐标一样?

我怎样才能不更改坐标?非常感谢!!

【问题讨论】:

您能否显示minimal reproducible example,每个人都可以剪切/粘贴完全如图所示,编译、运行和重现您的问题?对于不知道该程序其余部分的人来说,显示的两块代码意义不大。这种问题可能有多种原因,所以如果没有minimal reproducible example,没有人可以帮助您。 【参考方案1】:

for (auto co : ro) 复制每个迭代的对象渲染调用,如co.setX() 无用。这就像按值传递参数。如果您需要循环(函数)来改变可迭代的元素(参数),请将它们绑定到引用循环变量(参数)。

使用for (auto&amp; co : ro),详情请参阅this answer。

for (auto ro : getCurrent()-&gt;block) 循环也是如此,使用 const auto&amp; 来避免额外的副本。

【讨论】:

以上是关于更改派生类对象的字段,但返回后更改已恢复的主要内容,如果未能解决你的问题,请参考以下文章

从派生类永久更改基类?

如何处理派生类的多个重载而不需要对其他文件进行多次更改

如何知道 CDialog 派生类中的焦点何时更改

如何影响派生类中受保护的基变量

c ++派生类更改基类指针

如何通过派生类函数从基类更改向量