【发布时间】:2020-12-19 09:58:48
【问题描述】:
我创建了具有构造函数和运算符 + 重载以添加两个矩阵的类 mat(矩阵),但是当我编译并运行我的代码时,一切正常,直到我初始化我的 m1、m2..然后结果是“分段错误(核心转储)”。 我不明白为什么它显示它? 我没有在此处发布 ostream& 运算符
class mat{
int r,c;
float **p;
public:
mat(){}
mat(int,int);
mat(int,int,float);
void initialize();
mat operator+(mat); //defined
friend ostream& operator<<(ostream&,mat&);
};
void mat :: initialize(void){
int i,j;
cout<<"\nEnter the elements : ";
for(i=0;i<r;++i){
for(j=0;j<c;++j){
cin>>p[i][j];
}
}
return;
}
mat mat :: operator+(mat x){
mat tmp;
int i,j;
for(i=0;i<r;++i){
for(j=0;j<c;++j){
tmp.p[i][j]=(p[i][j])+(x.p[i][j]);
}
}
return tmp;
}
mat :: mat (int a, int b){
r=a;
c=b;
p=new float*[r];
for(int i=0; i<r; ++i){
p[i]=new float[c];
}
}
mat :: mat (int a, int b, float t){
r=a;
c=b;
p=new float*[r];
for(int i=0; i<r; ++i){
p[i]=new float[c];
}
for(int i=0;i<r;++i){
for(int j=0;j<c;++j){
p[i][j]=t;
}
}
}
int main(){
mat m1(3,3),m2(3,3),m3(3,3,0);
cout<<"\nInitialize M1";
m1.initialize();
cout<<"\nInitialize M2";
m2.initialize();
m3=m1+m2;
cout<<m3;
return(0);
}
我是编码新手。请用简单的语言帮助我。
【问题讨论】:
-
您的
mat类不能安全地复制或分配,但您正在operator +中重新使用它。这是rule of 3 违规(请参阅该链接的管理资源部分)。要么编写必要的用户定义的复制构造函数、赋值运算符和析构函数,要么使用std::vector<std::vector<float>> p;。如果您执行后者,您的代码可能会神奇地开始工作。 -
例如
mat tmp;你复制到 tmp 虽然你还没有分配任何空间 tmp.p。使用 std::vector 代替,那么您的许多问题都会消失。 -
您也未能在
mat默认构造函数中初始化您的成员变量。基本上,您的mat课程以几种不同的方式被破坏,甚至考虑为它编写operator +还为时过早。 -
@AndersK 非常感谢。它奏效了。 ...我意识到我在这个过程中犯了什么错误。