这是我编写的一个程序,用于从向量创建Matrix类,意图重载运算符。可能有更好的方法来做到这一点,但此时我只是遇到一个问题。由于某种原因,在我的重载操作符+函数中,它正确地执行了该函数,但是,当它将Matrix返回到main()时,一切都会丢失。
在main中,我做test3 = test + test2。 +运算符工作(我测试过)。 =运算符工作(我只用test3 = test测试过),但是当我像这样组合它时它不起作用。
#include <iostream>
#include <vector>
using namespace std;
班级定义
class Matrix
{
private:
vector<vector<int>> Mat;
Matrix() {};
public:
Matrix(vector<vector<int>> mat): Mat(mat) {cout << "Constructor" << endl;};
~Matrix() {};
Matrix(const Matrix &rhs);
//mutators & accessors
int getnum(int r, int c)const {return Mat[r][c];};
int getrow()const {return (Mat.size());};
int getcol()const {return (Mat[0].size());};
//overloaded operators
friend ostream & operator<<(ostream &os, const Matrix &rhs);
Matrix &operator+(const Matrix &rhs);
Matrix &operator=(const Matrix &rhs);
//Matrix &operator*(const Matrix &lhs, const Matrix &rhs);
//Matrix &operator*(const Matrix &lhs, const vector<int> &rhs);
};
主要
int main()
{
vector<vector<int>> A(4,vector<int>(4,0));
vector<vector<int>> B(4,vector<int>(4,0));
vector<vector<int>> C(1,vector<int>(1,0));
for(int i(0); i < 4; ++i)
for(int j(0); j < 4; ++j)
{
A[i][j] = i;
B[j][i] = i;
}
Matrix test(A);
Matrix test2(B);
Matrix test3(C);
test3 = test + test2;
cout << test3;
return 0;
}
复制构造函数
Matrix::Matrix(const Matrix &rhs)
{
Mat = rhs.Mat;
cout << "copy constructor" << endl;
}
重载运算符
ostream &operator<<(ostream &os, const Matrix &rhs)
{
for(int i(0); i < rhs.getrow(); ++i)
{
for(int j(0); j < rhs.getcol(); ++j)
os << rhs.getnum(i, j) << '\t';
os << endl;
}
return os;
}
Matrix &Matrix::operator+(const Matrix &rhs)
{
vector<vector<int>> temp(getrow(), vector<int>(getcol(), 0));
Matrix Temp(temp);
if((getrow() != rhs.getrow()) || (getcol() != rhs.getcol()))
{
cout << "Addition cannot be done on these matrices (dims not equal)" << endl;
exit(1);
}
for(unsigned int i(0); i < Temp.getrow(); i++)
for(unsigned int j(0); j < Temp.getcol(); j++)
Temp.Mat[i][j] = getnum(i, j) + rhs.getnum(i, j);
return Temp;
}
Matrix &Matrix::operator=(const Matrix &rhs)
{
cout << rhs.getrow() << endl;
this->Mat.resize(rhs.getrow());
for(int i(0); i < this->getrow(); ++i)
this->Mat[i].resize(rhs.getcol());
for(int i(0); i < this->getrow(); ++i)
for(int j(0); j < this->getcol(); ++j)
this->Mat[i][j] = rhs.Mat[i][j];
return *this;
}
答案 0 :(得分:1)
代码的问题在于执行此操作test3 = test + test2;
重载的运算符+返回对局部变量Temp
的引用。
您不能返回对局部变量的引用,因为一旦函数退出,t就会被销毁。因此,在operator +()函数内部,您不能返回对该变量的引用,因为当调用函数获得返回值时它不再存在。
您可以将定义更改为
Matrix Matrix::operator+(const Matrix &rhs)
它将编译并正常工作。