2d矩阵在课堂上使用矢量

时间:2013-12-03 18:33:43

标签: c++ vector multidimensional-array

这是我编写的一个程序,用于从向量创建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;
}

1 个答案:

答案 0 :(得分:1)

代码的问题在于执行此操作test3 = test + test2;

重载的运算符+返回对局部变量Temp的引用。 您不能返回对局部变量的引用,因为一旦函数退出,t就会被销毁。因此,在operator +()函数内部,您不能返回对该变量的引用,因为当调用函数获得返回值时它不再存在。

您可以将定义更改为

Matrix Matrix::operator+(const Matrix &rhs)

它将编译并正常工作。