C++编译报错:无法将列表初始化值赋值给int(第19、20行)
错误原因与修复方案
核心错误(第19、20行)
m1[x][x]是单个int类型元素,你却试图用二维数组的大括号初始化列表给它赋值,类型完全不匹配,这是编译器报错的直接原因。- 构造函数的参数名和类成员变量名重名了,导致你操作的是局部参数而非类的成员变量。
- C++里不能直接用赋值语句给整个数组批量赋值,必须通过循环逐个拷贝元素。
完整修复后的代码
#include <iostream> using namespace std; class matrix{ private: static const int x =3; int m1[x][x]; int m2[x][x]; int c[x][x]; public: // 默认构造函数:初始化m1、m2为指定值,避免垃圾值 matrix(){ // 先定义初始化用的临时数组 int init_m1[x][x] = {{1,2,3},{4,5,6},{7,8,9}}; int init_m2[x][x] = {{10,11,12},{13,14,15},{16,17,18}}; // 循环拷贝到类成员变量 for(int i=0; i<x; i++){ for(int j=0; j<x; j++){ m1[i][j] = init_m1[i][j]; m2[i][j] = init_m2[i][j]; c[i][j] = 0; // 结果矩阵先初始化为0 } } } // 带参数的构造函数:用传入的矩阵初始化成员变量 matrix(int input_m1[x][x], int input_m2[x][x]){ for(int i=0; i<x; i++){ for(int j=0; j<x; j++){ m1[i][j] = input_m1[i][j]; m2[i][j] = input_m2[i][j]; c[i][j] = 0; } } } // 矩阵加法重载:修正逻辑,使用当前对象和传入对象的矩阵元素计算 matrix operator+(const matrix& other){ matrix result; for(int i=0; i<x; i++){ for(int j=0; j<x; j++){ result.c[i][j] = this->m1[i][j] + other.m1[i][j]; } } return result; } // 矩阵减法重载 matrix operator-(const matrix& other){ matrix result; for(int i=0; i<x; i++){ for(int j=0; j<x; j++){ result.c[i][j] = this->m1[i][j] - other.m1[i][j]; } } return result; } // 矩阵乘法重载:修正为标准矩阵乘法(原代码是元素逐个相乘,不符合数学定义) matrix operator*(const matrix& other){ matrix result; for(int i=0; i<x; i++){ for(int j=0; j<x; j++){ result.c[i][j] = 0; for(int k=0; k<x; k++){ result.c[i][j] += this->m1[i][k] * other.m1[k][j]; } } } return result; } // 输出运算符重载:修复无限递归问题,正确打印矩阵内容 friend ostream& operator <<(ostream& outs, const matrix& m){ for(int i=0; i<x; i++){ for(int j=0; j<x; j++){ outs << m.c[i][j] << " "; } outs << endl; } return outs; } }; int main(){ matrix m1; matrix m2; cout << "矩阵加法结果:" << endl; cout << m1 + m2 << endl; cout << "矩阵乘法结果:" << endl; cout << m1 * m2 << endl; return 0; }
其他关键修复点
- 默认构造函数里别再定义同名局部变量,不然会覆盖类的成员变量,导致成员变量还是垃圾值。
- 运算符重载的参数改用
const matrix&,避免不必要的拷贝,同时兼容const对象。 - 原
operator<<里写outs << m会触发无限递归,必须改成直接遍历打印矩阵元素。 - 移除了带参数构造函数里多余的
c参数,因为c是计算结果矩阵,不需要外部传入。
内容的提问来源于stack exchange,提问作者Mohammed Al-Khater
相关产品推荐
相关产品推荐

