C++重载:算子+元素加矩阵
我试图为矩阵程序重载+运算符。这是我的代码,我觉得没问题。但是,当我在主函数中添加两个矩阵时,什么也没有发生。 有人能帮忙吗? 谢谢: 顺便说一句: -程序编译并运行良好,直到它应该添加到矩阵中为止 -我假设我的操作符+-函数的实现中存在问题,因为我已经将代码复制到addMtrx,Mtrx函数中进行测试,但它也不起作用 //Mtrx.hC++重载:算子+元素加矩阵,c++,matrix,operators,operator-overloading,addition,C++,Matrix,Operators,Operator Overloading,Addition,我试图为矩阵程序重载+运算符。这是我的代码,我觉得没问题。但是,当我在主函数中添加两个矩阵时,什么也没有发生。 有人能帮忙吗? 谢谢: 顺便说一句: -程序编译并运行良好,直到它应该添加到矩阵中为止 -我假设我的操作符+-函数的实现中存在问题,因为我已经将代码复制到addMtrx,Mtrx函数中进行测试,但它也不起作用 //Mtrx.h #ifndef MTRX_H_ #define MTRX_H_ #include <iostream> #include <string>
#ifndef MTRX_H_
#define MTRX_H_
#include <iostream>
#include <string>
using namespace std;
using std::ostream;
class Mtrx {
int lines,cols;
float **p;
public:
Mtrx();
Mtrx(int,int);
int getLines();
int getCols();
float getElement(int,int);
void setLines(int);
void setCols(int);
void setElement(int,int,float);
Mtrx operator+(Mtrx&);
~Mtrx();
};
ostream& operator<<(ostream& os, Mtrx& m);
#endif /* MTRX_H_ */
//Mtrx.cpp
//...
//...
Mtrx::~Mtrx(){
delete p;
p = NULL;
}
Mtrx Mtrx::operator+(Mtrx& m){
if(this->getLines() == m.getLines() && this->getCols() == m.getCols()){
Mtrx res(getLines(),getCols());
for (int i = 1; i <= this->getLines(); i++){
for(int j = 1; j <= this->getCols(); j++){
res.setElement(i,j,(this->getElement(i,j)+m.getElement(i,j)));
}
}
return res;
}
您有一个析构函数,但缺少一个复制构造函数和赋值运算符。根据经验,如果你有任何一个,你应该拥有所有的
Mtrx(const Mtrx&);
Mtrx& operator=(const Mtrx&);
~Mtrx();
如果没有显式的复制构造函数,编译器将为您生成一个。但它并不聪明,所以当它复制一个矩阵时,它不知道为p分配新的内存。它只是复制指针,导致原始矩阵和副本都引用相同的内存。当他们的析构函数运行时,他们两人都会调用delete p,这对第二个人来说是个坏消息
这正是运算符+返回并复制res时发生的情况。您有一个析构函数,但缺少一个复制构造函数和赋值运算符。根据经验,如果你有任何一个,你应该拥有所有的
Mtrx(const Mtrx&);
Mtrx& operator=(const Mtrx&);
~Mtrx();
如果没有显式的复制构造函数,编译器将为您生成一个。但它并不聪明,所以当它复制一个矩阵时,它不知道为p分配新的内存。它只是复制指针,导致原始矩阵和副本都引用相同的内存。当他们的析构函数运行时,他们两人都会调用delete p,这对第二个人来说是个坏消息
这正是operator+返回并复制res时发生的情况。检查大括号。您可能缺少一个,或者iffalse的控制路径没有返回
Mtrx Mtrx::operator+(Mtrx& m){
if(this->getLines() == m.getLines() && this->getCols() == m.getCols()){
Mtrx res(getLines(),getCols());
for (int i = 1; i <= this->getLines(); i++){
for(int j = 1; j <= this->getCols(); j++){
res.setElement(i,j,(this->getElement(i,j)+m.getElement(i,j)));
}
}
return res;
}
检查你的牙套。您可能缺少一个,或者iffalse的控制路径没有返回
Mtrx Mtrx::operator+(Mtrx& m){
if(this->getLines() == m.getLines() && this->getCols() == m.getCols()){
Mtrx res(getLines(),getCols());
for (int i = 1; i <= this->getLines(); i++){
for(int j = 1; j <= this->getCols(); j++){
res.setElement(i,j,(this->getElement(i,j)+m.getElement(i,j)));
}
}
return res;
}
1..nLines和1..nCols的迭代看起来可疑。这是故意的还是你想从零开始?你能粘贴你的主文件吗?运算符+看起来正常。从1..nLines和1..nCols开始的迭代看起来可疑。这是故意的还是你想从零开始?你能粘贴你的主文件吗?operator+看起来不错。谢谢。这似乎就是问题的症结所在。我是C++初学者,所以我很难实现三的规则。数小时之后,我确定我的新赋值运算符和析构函数正在工作,但我的复制构造函数仍然没有:Mtrx::Mtrxconst Mtrx&m{对不起,格式化,我比C++更差。谢谢。这似乎是问题所在。我是C++初学者,所以我在执行三的规则时有困难。经过几个小时和几个小时,我确定我的新赋值操作符和析构函数正在工作,但是我的复制构造函数仍然没有。StMrx& M.C.To.Fufft关于格式化,我比在C++中更糟糕。