C++中如何通过类对象的const引用调用make_move等public成员方法
问题原因
你遇到的报错是C++的const限定符规则导致的:
solve函数的入参定义为const State &st,表示你承诺不会在函数内部修改该引用指向的State对象- 而
make_move、set_game_ended都是会修改State内部成员(棋盘数组sq、当前落子方to_move、已填充计数filled、游戏结束标记)的非const成员函数,const对象不允许调用这类会修改自身状态的方法,因此编译器触发报错。
解决方案
根据你的业务需求选任意一种即可:
方案1:修改入参定义,允许修改外部传入的原始状态
如果你的业务需要调用solve之后,外部拿到的就是落子完成的终局状态,直接去掉入参的const修饰符即可:
void solve(State &st) { while (!st.full() && !st.gameEnded()) { auto value = minimax(st); // 为当前玩家寻找最优落子 st.make_move(get<1>(value), get<2>(value)); if (st.max_value() == 1 || st.max_value() == -1) // x或o一方获胜 { st.set_game_ended(true); } } st.print(); // 打印终局棋盘状态 if (st.max_value() == 0) // 无玩家获胜且棋盘已满,平局 { cout << "draw" << endl; } }
方案2:内部创建状态副本,不修改外部原始状态
如果不希望改动外部传入的初始状态,只在函数内部做落子推演,就在函数内基于const输入创建一个本地非const副本,所有操作都针对副本执行:
void solve(const State &st) { State local_st = st; // 拷贝原始状态到本地非const对象 while (!local_st.full() && !local_st.gameEnded()) { auto value = minimax(local_st); // 为当前玩家寻找最优落子 local_st.make_move(get<1>(value), get<2>(value)); if (local_st.max_value() == 1 || local_st.max_value() == -1) // x或o一方获胜 { local_st.set_game_ended(true); } } local_st.print(); // 打印终局棋盘状态 if (local_st.max_value() == 0) // 无玩家获胜且棋盘已满,平局 { cout << "draw" << endl; } }
最佳实践建议
对于full()、gameEnded()、max_value()、print()这类不会修改类内部成员的只读方法,建议在类定义时给方法加上const修饰符,这样const和非const对象都可以正常调用这类方法,示例如下:
public: bool full() const { // 实现逻辑,不会修改任何成员变量 } bool gameEnded() const { // 实现逻辑 } int max_value() const { // 实现逻辑 } void print() const { // 实现逻辑 }
内容的提问来源于stack exchange,提问作者Proxied
相关产品推荐
相关产品推荐

