【问题标题】:Passing data from constructor to member function将数据从构造函数传递给成员函数
【发布时间】:2020-11-19 19:00:31
【问题描述】:

我正在尝试编写一个执行matrix 乘法的类。这 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];
        }
    }
}

我该如何解决?

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

【问题讨论】:

  • 在 ctor 中尝试M = vector&lt;vector&lt;int&gt; &gt;(m, vector&lt;int&gt;(n, 0));
  • 想想这个。在您的代码中,您两次声明 M。一次在类中,一次在构造函数中。你不认为你应该只需要声明一次吗?去掉构造函数中的声明,只需要类中的声明即可。
  • 另一件要考虑的事情(但不是您实际询问的内容)。在您的代码中,您已经展示了如何使用向量。但是在您的matrix::Mul 方法中,您使用的是ppInt 的指针。你为什么这么做?如果向量最适合M,为什么它不适合ppInt?您在matrix::Mul 中使用指针实际上是错误的,因为您有内存泄漏。将matrix::Mul 更改为ppInt 是一个向量,这将修复内存泄漏,同时也使代码更简单。
  • 当你的矩阵对象被创建时,你的数据向量 M 也会被创建。构造函数不应该重新声明 M,只需重新调整大小即可。您现在声明的向量将不是该类的一部分,但由于已经有一个 (*this)-&gt;M,我很惊讶它可以编译。

标签: c++ class c++11 constructor member-functions


【解决方案1】:

我在此初始化并输入矩阵M的元素 构造函数!

不!您使用的是本地 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 永远不会被初始化。


我该如何解决?

为了修复,你可能想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
}

【讨论】:

    【解决方案2】:

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

    不,你没有。您正在初始化一个名为 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];
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-18
      相关资源
      最近更新 更多