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