Matrix类Getter方法异常:返回int而非float问题求助
你的代码存在两个核心问题,导致返回值不符合预期且测试失败:
1. 索引边界判断错误,且测试使用了错误的索引体系
你的element和set_element方法中,越界判断条件是row > nRows和col > nCols,但C++数组/容器的索引是0-based(从0开始),有效索引范围应为0 <= row < nRows、0 <= col < nCols。当你在测试中传入row=2、col=2(对应2x2矩阵的"第2行第2列"),row > nRows的判断结果为2 > 2(false),不会触发越界异常,但实际已经访问到数组的非法内存区域,取出的是随机值,直接导致测试失败。
同时你的测试代码使用了1-based索引(从1开始),但底层实现是0-based,两者不匹配,导致元素存错位置。
2. data成员的类型可能为int而非float
如果你的Matrix类中data被声明为int[]或vector<int>,那么即使set_element传入float类型的值,也会被强制截断为整数存储。比如1.0会被存成1,虽然element方法返回时会转成float类型的1.0,但如果存储非整数值(如1.5)会直接丢失精度;更关键的是,若因索引越界访问到其他int类型的内存值,转成float后会完全不符合预期。
修复步骤
步骤1:修正索引边界判断
将越界判断中的row > nRows改为row >= nRows,col > nCols改为col >= nCols,确保有效索引范围正确:
float Matrix::element(int row, int col) const { if (row < 0 || row >= nRows || col < 0 || col >= nCols) throw out_of_range("Index out of range."); return data[row * nCols + col]; } void Matrix::set_element(int row, int col, float val) { if (row < 0 || row >= nRows || col < 0 || col >= nCols) { cerr << "Error: index is out of range. " << endl; throw out_of_range("Index is out of range."); } data[row * nCols + col] = val; }
步骤2:确保data成员为float类型
检查Matrix类的声明,将data定义为float类型的数组或向量:
// Matrix类内部声明示例 class Matrix { private: int nRows; int nCols; vector<float> data; // 推荐使用vector,自动管理内存 // 或 float* data; // 需手动管理内存 public: // 构造函数、成员方法... };
步骤3:调整测试代码为0-based索引
修改测试中的索引,匹配底层实现的0-based体系,同时可以设置cout的输出格式,强制显示小数部分:
#include <iomanip> // 用于setprecision void test() { Matrix A(2, 2); A.set_element(0, 0, 1.0); A.set_element(0, 1, 2.0); A.set_element(1, 0, 3.0); A.set_element(1, 1, 4.0); Matrix B(2, 2); A.add(B); // 确保add方法正确实现:A的元素 += B的元素,B默认初始化应为0,所以A值不变 // 设置输出格式,强制显示1位小数 cout << fixed << setprecision(1) << A.element(0, 0) << endl; // 使用1.0f匹配float类型,避免隐式转换 if (almost_equal(A.element(0, 0), 1.0f) && almost_equal(A.element(0, 1), 2.0f) && almost_equal(A.element(1, 0), 3.0f) && almost_equal(A.element(1, 1), 4.0f)) { cerr << "Passed" << endl; } else { cerr << "Failed" << endl; return; } }
步骤4:确保almost_equal函数正确实现
如果almost_equal是自定义函数,需确保它能正确比较float类型的近似相等:
#include <cmath> bool almost_equal(float a, float b, float epsilon = 1e-6) { return std::abs(a - b) < epsilon; }
内容的提问来源于stack exchange,提问作者rail

