You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:45:10