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
相关产品推荐
相关产品推荐

