找到后更改类变量

时间:2018-11-01 06:59:34

标签: c++ class chess

我目前正在使用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

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

您应该返回指向该成员的指针

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

答案 2 :(得分:0)

您可以通过返回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;
}