将数据从构造函数传递给成员函数

Passing data from constructor to member function

我正在尝试编写一个 class 来执行 matrix 乘法。这 class matrix 声明如下:

class matrix
{
public:
    vector<vector<int> > M;

    matrix();
    matrix(int m, int n);
    matrix(vector<vector<int> > &m);
    matrix Mul(matrix m1);
    void Inverse();
    bool SquareMatrix();
    void GetDet();
    int Det(vector<vector<int> > &m);
    void Print();
};

我在这个构造函数中初始化并输入矩阵M的元素:

matrix::matrix(int m, int n)
{
    vector<vector<int> > M(m, vector<int>(n, 0));
    cout << "Enter the elements: " << endl;

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

但是,成员函数“Mul”并没有接收到我通过构造函数输入的数据。

matrix matrix::Mul(matrix m1)
{
    int **ppInt;
    ppInt = new int *[M.size()];
    for (int i = 0; i < M.size(); i++)
    {
        ppInt[i] = new int[m1.M[0].size()];
    }

    if (M[0].size() != m1.M.size())
    {
        cout << "Cannot do multiplication!" << endl;
        return matrix();
    }
    else
    {
        for (int i = 0; i < M.size(); i++)
        {
            for (int j = 0; j < m1.M[0].size(); j++)
            {
                int ele_buf = 0;
                for (int k = 0; k < M[0].size(); k++)
                {
                    ele_buf += M[i][k] * m1.M[k][j];
                }
                ppInt[i][j] = ele_buf;
            }
        }
    }
    int d1 = M.size(), d2 = m1.M[0].size();

    for (int i = 0; i < M.size(); i++)
    {
        M[i].clear();
    }
    M.clear();

    for (int i = 0; i < d1; i++)
    {
        for (int j = 0; j < d2; j++)
        {
            M[i][j] = ppInt[i][j];
        }
    }
}

我该如何解决?

如果我的问题不够清楚,请告诉我。

I initialize and enter the elements of the matrix M in this constructor!

没有!您正在与本地 M 合作,而不是与成员 M.

合作

在构造函数中

matrix::matrix(int m, int n)
{
    vector<vector<int> > M(m, vector<int>(n, 0));  // local to the constructor only!
    // .........
}

M 是构造函数作用域的局部,shadows the member you defined with the same name M。因此它(即构造函数中的那个)将在构造函数范围之后被销毁。实际上,成员 M 永远不会被初始化。


How can I fix it?

为了修复,您可能需要 std::vector::resize 成员 M

matrix(int m, int n)
{
   M.resize(m, vector<int>(n, 0)); // resize M with `m` and `n`
   std::cout << "Enter the elements: " << std::endl;

   for (std::vector<int>& row : M)
      for (int& ele : row)
         std::cin >> ele;  // fill the elements
}

I initialize and enter the elements of the matrix M in this constructor:

不,你不知道。您正在初始化一个名为 M 的向量,它隐藏同名成员。构造函数中的 M 是构造函数本地的不同向量。

要初始化成员,请使用初始化列表:

matrix::matrix(int m, int n) : M(m, vector<int>(n, 0)) {
cout << "Enter the elements: " << endl;

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