【问题标题】:Change class variable after finding找到后更改类变量
【发布时间】:2018-11-01 06:59:34
【问题描述】:

我目前正在使用 C++ 开发国际象棋引擎,并且在引擎中,我正在尝试修改另一个名为“ChessBoard”的类“ChessTile”中的字符串变量“piece”。

无论如何,当我使用函数返回一个类,然后修改该类时,它不会改变源变量,我想知道你是怎么做到的。

这是我编写的一个简单脚本来演示:

#include <iostream>
#include <string>

class child {
private:
    int myVar;

public:
    child(int v) {
        myVar = v;
    }

    int getVar() {
        return myVar;
    }

    int setVar(int Svar) {
        this->myVar = Svar;
        return 0;
    }
};

class parent {
public:
    child baby = child(0);

    child findMyChild(int var) {
        if (var == 1) {
            return baby;
        }
    }
};

parent DAD;

int main() {
    std::cout << DAD.findMyChild(1).getVar() << std::endl;
    DAD.findMyChild(1).setVar(50);
    std::cout << DAD.findMyChild(1).getVar() << std::endl;
}

这个的输出是:

0
0

但我希望它是:

0
50

如有必要,我还可以发布我的国际象棋引擎。谢谢!

【问题讨论】:

    标签: c++ class chess


    【解决方案1】:

    在您的代码中,findMyChild() 正在返回 baby 的副本(按值返回的函数),请使用按引用返回,就像这样。

    child& parent::findMyChild(int var) {
        if (var == 1)
        {
           return baby;
        }
        /* other codes */
        return baby; 
    } 
    

    【讨论】:

    • 我想了很多,但不确定如何返回参考。非常感谢您的宝贵时间!
    • var != 1 会怎样?也代表这个问题。目前两者都是UB
    • @pergy:同意但 OP 展示了一个玩具程序,可能是父级下的多个子对象。代码已编辑。
    【解决方案2】:

    您将在findMyChild 中返回child 的副本。因此,您只修改该副本,而不是成员本身。

    你应该返回一个指向成员的指针

    child* findMyChild(int var) {
        return var == 1
          ? &baby
          : nullptr;
    }
    

    然后取消引用它以获取/设置其值。例如:

    DAD.findMyChild(1)->setVar(50);
    

    由于findMyChild 可以在我的代码中返回空指针,你应该在访问之前检查它的存在

    child* c = DAD.findMyChild(1);
    if (c) c->setVar(50);
    

    【讨论】:

    • 如果没有找到孩子,这将取消引用一个空指针。最好避免使用原始指针,例如如果没有找到,则通过引用返回或抛出异常。
    • 确实如此。应该做一些检查。使用你应该抛出的参考,在我眼中几乎增加了相同的复杂性。这就是为什么我在这种有条件的情况下更喜欢原始指针。
    【解决方案3】:

    您可以通过返回 child 的指针/引用来完成此操作,如另一条评论所述,或者您可以通过 parent 类中的接口完成此操作。

    #include <iostream>
    #include <string>
    
    #define FIRST_CHILD 1
    #define CANNOT_FIND_CHILD -1
    
    class child {
    private:
        int myVar;
    
    public:
        child(int v) {
            myVar = v;
        }
    
        int childGetVar() {
            return myVar;
        }
    
        int childSetVar(int Svar) {
            this->myVar = Svar;
            return 0;
        }
    };
    
    class parent {
    public:
        child baby = child(0);
        int getVar(int var) {
            if (var == FIRST_CHILD)
                return baby.childGetVar();
            return CANNOT_FIND_CHILD;
        }
    
        int setVar(int var, int Svar) {
            if (var == FIRST_CHILD)
                baby.childSetVar(Svar);
            return CANNOT_FIND_CHILD;
        }
    };
    
    parent DAD;
    
    int main() {
        std::cout << DAD.getVar(FIRST_CHILD) << std::endl;
        DAD.setVar(FIRST_CHILD, 50);
        std::cout << DAD.getVar(FIRST_CHILD) << std::endl;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2015-01-21
      • 1970-01-01
      • 2019-12-03
      相关资源
      最近更新 更多