C++ 修改/访问矩阵内容C++;

C++ 修改/访问矩阵内容C++;,c++,matrix,operator-overloading,C++,Matrix,Operator Overloading,我有一个表示矩阵的类的代码: class Matrix { private: int** M; int n, m; public: Matrix(int _n, int _m, int v) { n = _n; m = _m; M = new int*[n]; for (int i = 0; i < n; i++) M[i] = new int[m]; fo

我有一个表示矩阵的类的代码:

class Matrix {
private:
    int** M;
    int n, m;
public:
    Matrix(int _n, int _m, int v) {
        n = _n;
        m = _m;

        M = new int*[n];

        for (int i = 0; i < n; i++)
            M[i] = new int[m];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++)
                M[i][j] = v;
        }
    }

    int operator() (unsigned row, unsigned col) {
        return this -> M[row][col];
    }

    void set(int i, int j, int v) {
        M[i][j] = v;
    }
};
而不是


您已将
int**M
设置为私有变量。私有变量的概念是,您不能在类之外显式地更改它(请参阅)。您可以执行以下两种操作之一:


  • 返回对元素的引用,如下所示:

    int&运算符()(无符号行、无符号列)
    {
    返回M[行][col];
    }

  • 使
    int**M
    成为公共变量。这将允许您正常访问main.cpp中的
    m.m[2][2]


  • 返回对元素的引用。但认真地说,用一块数据来实现矩阵。在这里使用动态数组的动态数组没有意义。要在@juanchopanza的基础上添加一个签名为
    int&operator()(int x,int y)
    的方法,谢谢!现在它工作了。。。你能更详细地解释一下为什么如果我返回一个引用/地址有效,而如果我返回的值无效。谢谢当您有一个私有变量时,只有类可以直接更改它。因此,如果你说
    m.m[2][2]=3当它还是私有的时候,你的编译器会对你大喊大叫。但是,当您传递引用时,您不是直接更改
    m.m
    ,而是更改对它的引用。
    Matrix m(4,4,0);
    m(2,2) = 10000; // ERROR!
    
    m.set(2,2,10000);