这是我编写的用于从 vector 创建Matrix类的程序,旨在重载运算符。也许有更好的方法可以做到这一点,但目前我只遇到一个问题。由于我的重载operator +函数中的某些原因,它可以正确执行该函数,但是,当将Matrix返回到main()时,所有内容都会丢失。

总的来说,我做test3 = test + test2。 +运算符有效(我已经测试过)。 = operator可以工作(我只用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;
}

最佳答案

您的代码的问题是当您执行此test3 = test + test2;

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

您可以将定义更改为

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

它将编译并正常工作。

关于c++ - 类中使用 vector 的2d矩阵,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20358950/

10-09 18:32