C++ 填充动态数组int
C++ fill dynamic array int
我正在编写程序,该程序将使用线程乘以矩阵。我在填充动态 int 数组时遇到问题 (不能使用向量).
cpp 文件:
Matrix::Matrix(int n, int m)
{
mac_ = new int[n * m];
}
Matrix::Matrix(std::istream & is)
{
int tmp;
int i = 0;
is >> m_; //rows
is >> n_; //columns
Matrix(n_, m_); // using 1st constructor
while (is.peek() != EOF) {
is >> tmp;
mac_[i] = tmp; // debug stop here
i++;
}
}
hpp 文件的一部分:
private:
int n_; // columns
int m_; // rows
int *mac_;
从调试中我得到:
this 0x0079f7b0 {n_=3 m_=2 mac_=0x00000000 {???} }
我知道我可以在第二个构造函数中写 mac_ = new int(n_*m_);
但我想知道为什么第一个构造函数不起作用。
// ...
Matrix(n_, m_); // using 1st constructor
while (is.peek() != EOF) {
is >> tmp;
mac_[i] = tmp; // debug stop here
i++;
}
看来你认为在这里调用构造函数构造了实际对象(this
),然后你访问它的成员属性mac_
.
事实上,像您那样调用构造函数会创建另一个与该矩阵无关的对象(因为您没有将它存储在变量中,所以它会在行尾被破坏)。
所以因为你构建了另一个对象而不是 this
,this->mac_
未初始化,因此你的错误。
像这样修改您的代码:
Matrix::Matrix(int n, int m)
{
init(n, m);
}
Matrix::Matrix(std::istream & is)
{
int tmp;
int i = 0;
is >> m_; //rows
is >> n_; //columns
init(n_, m_);
while (is.peek() != EOF) {
is >> tmp;
mac_[i] = tmp; // debug should not stop here anymore
i++;
}
}
void Matrix::init(int n, int m)
{
mac_ = new int[n * m];
}
注意:这里我把函数中的初始化去掉了init
(应该是私有方法),避免代码重复
我正在编写程序,该程序将使用线程乘以矩阵。我在填充动态 int 数组时遇到问题 (不能使用向量).
cpp 文件:
Matrix::Matrix(int n, int m)
{
mac_ = new int[n * m];
}
Matrix::Matrix(std::istream & is)
{
int tmp;
int i = 0;
is >> m_; //rows
is >> n_; //columns
Matrix(n_, m_); // using 1st constructor
while (is.peek() != EOF) {
is >> tmp;
mac_[i] = tmp; // debug stop here
i++;
}
}
hpp 文件的一部分:
private:
int n_; // columns
int m_; // rows
int *mac_;
从调试中我得到:
this 0x0079f7b0 {n_=3 m_=2 mac_=0x00000000 {???} }
我知道我可以在第二个构造函数中写 mac_ = new int(n_*m_);
但我想知道为什么第一个构造函数不起作用。
// ...
Matrix(n_, m_); // using 1st constructor
while (is.peek() != EOF) {
is >> tmp;
mac_[i] = tmp; // debug stop here
i++;
}
看来你认为在这里调用构造函数构造了实际对象(this
),然后你访问它的成员属性mac_
.
事实上,像您那样调用构造函数会创建另一个与该矩阵无关的对象(因为您没有将它存储在变量中,所以它会在行尾被破坏)。
所以因为你构建了另一个对象而不是 this
,this->mac_
未初始化,因此你的错误。
像这样修改您的代码:
Matrix::Matrix(int n, int m)
{
init(n, m);
}
Matrix::Matrix(std::istream & is)
{
int tmp;
int i = 0;
is >> m_; //rows
is >> n_; //columns
init(n_, m_);
while (is.peek() != EOF) {
is >> tmp;
mac_[i] = tmp; // debug should not stop here anymore
i++;
}
}
void Matrix::init(int n, int m)
{
mac_ = new int[n * m];
}
注意:这里我把函数中的初始化去掉了init
(应该是私有方法),避免代码重复