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

C++面向对象重写滑块拼图时getNumber获取坐标异常问题求助

问题修复方案

核心问题汇总

  • Deck构造函数变量遮蔽

    你在Deck构造函数内部又声明了一个局部变量std::array <Number,100> m_game;,这个局部变量和类的成员变量m_game重名,所有初始化操作都是针对这个局部变量执行的,构造函数执行结束后局部变量就被销毁,类本身的成员变量m_game从未被初始化过,存储的都是内存随机垃圾值,这是调用getNumber拿到异常大数值的核心原因。
    修复方法:删除Deck构造函数里的局部m_game声明,直接操作类的成员变量即可。
    修复后构造函数示例:

    Deck::Deck(int rows)
    {
      // 移除局部m_game的声明,直接操作类成员
      for (int j {0}; j < rows; ++j)
      {
        for (int i {0}; i < rows; ++i)
        {
          m_game[i+j*rows].setPosition (i,j);
          std::cout << "Number: " << (i+j*rows) << '\t' << "Coordinates: " << '\t' << m_game[i+j*rows].getPosition()[0] <<"," << m_game[i+j*rows].getPosition()[1] << '\n' ;
        };
      };
      std::cout << "fc Deck::Deck (int rows) Number10 posX: "<< m_game[10].getPosition()[0] << '\n';
      std::cout << "fc Deck::Deck (int rows) Number10 posY: "<< m_game[10].getPosition()[1] << '\n';
    }
    
  • game.cpp数组越界访问

    getPosition()返回的是大小为2的std::array<int,2>,仅支持下标0和1的合法访问,你代码里写的temp.getPosition()[10]是严重的越界访问,直接读取了数组之外的内存数据,自然拿到异常值。
    修复方法:如果要获取X坐标就取temp.getPosition()[0],获取Y坐标就取temp.getPosition()[1],或者直接调用getPositionX()、getPositionY()方法更稳妥。
    修复后调用示例:

    Number temp = deck.getNumber(10);
    int tempI = temp.getPositionX(); // 也可以写temp.getPosition()[0]
    std::cout << "CHECK game.h Number10 positionX: "<< tempI << '\n';
    
  • 潜在语法问题:Number类成员函数缺失返回值类型

    你定义的setPosition、setDigits等方法都没有声明返回值类型,C++标准不支持默认返回int的写法,编译阶段就会触发语法错误,需要给不需要返回值的方法加上void返回值类型。
    示例修改:

    // Number.h里的声明修改为
    void setPosition (int x, int y);
    void setPosition (std::array <int,2> &xy );
    void setDigits (int d);
    // cpp里的实现也对应加上void返回值
    

内容的提问来源于stack exchange,提问作者Tomáš Nadrchal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:36:05