将数据从构造函数传递给成员函数
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];
}
}
}
我正在尝试编写一个 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];
}
}
}