c++ - 矩阵运算符重载不起作用

标签 c++ matrix operators operator-overloading

我正在尝试制作一个示例(只是示例!我知道它会泄漏)应用程序来学习 C++ 中的运算符重载,但我得到的总和元素的值为零...。我怀疑问题所在是复制构造函数。

具体实现如下:

    class Matrix{
    public:
        Matrix(int row, int col);
        Matrix(const Matrix& src);
        float& set(int row, int col);
        float get(int row, int col);
        const Matrix & operator+(const Matrix& rhs);

    private:
        float* data;
        int nrow;
        int ncol;
};

Matrix::Matrix(int row, int col){
    nrow = row;
    ncol = ncol;
    data = new float[nrow*ncol];
}

Matrix::Matrix(const Matrix& src){
    nrow = src.nrow;
    ncol = src.ncol;
    data = new float[nrow*ncol];

    for(int i = 0; i < nrow*ncol; i++){
        data[i] = src.data[i];
    }
}

float& Matrix::set(int row, int col){
    return data[row*ncol+col];
}

float Matrix::get(int row, int col){
    return data[row*ncol+col];
}

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

    if (this->nrow == rhs.nrow && this->ncol == rhs.ncol){
        Matrix* m = new Matrix(rhs.nrow, rhs.ncol);
        for(int i=0; i< nrow*ncol; i++){
            m->data[i] = data[i] + rhs.data[i];
        }
        return *m;
    } else {
        throw -1;
    }
}

#include <iostream>

using namespace std;

int main ()
{
    Matrix A(1,1);
    Matrix B(1,1);

    A.set(0,0)=1;   
    B.set(0,0)=2;

    cout << A.get(0,0) << endl;
    cout << B.get(0,0) << endl;

    Matrix C = A + B; // Marix C(A+B);
    cout << C.get(0,0) << endl;

    return 0;
}

最佳答案

Matrix::Matrix(int row, int col){
    nrow = row;
    ncol = ncol;
    data = new float[nrow*ncol];
}

其中有一个拼写错误导致您的代码具有未定义的行为。

修复它:

    ncol = col;

(确保将编译器警告/诊断级别调到最大,GCC 会捕捉到这一点。)

您也泄漏了您的 float[],因此您的代码不完整。不要忘记添加适当的析构函数,并始终遵循 rule of three .

关于c++ - 矩阵运算符重载不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9130480/

相关文章:

c++ - assert(pointer) 引发分段违规

c++ - socket::send 后程序在没有核心文件的情况下退出

matrix - 求解受约束的线性方程组

python - 如何在 Python 中的矩阵之间逐个元素相乘?

c# - 相等运算符——总是左结合的,这有关系吗?

Haskell 应用程序或部分?

c++ - 在 C/C++ 中存储 21.6.7.1 等值的最佳数据类型

c++ - 我可以使用 std::pair,但重命名 .first 和 .second 成员名称吗?

java - 在 adj 矩阵图中找到最大的连通分量?

C++运算符重载<<与 vector