C ++填充动态数组int

时间:2016-11-26 19:28:56

标签: c++ constructor dynamic-arrays

我正在编写程序,它将使用线程乘以矩阵。我有填充动态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_;

从调试我得到:

  

这个0x0079f7b0 {n_ = 3 m_ = 2 mac_ = 0x00000000 {???}}

我知道我可以在第二个构造函数中编写mac_ = new int(n_*m_);,但我想知道为什么第一个不起作用。

1 个答案:

答案 0 :(得分:2)

// ...

Matrix(n_, m_); // using 1st constructor

while (is.peek() != EOF) {
    is >> tmp;
    mac_[i] = tmp; // debug stop here
    i++;
}

看起来您认为在此处调用构造函数构造实际对象(this),然后您访问其成员属性mac_

事实上,像你一样调用构造函数会创建一个与此矩阵无关的其他对象(因为你没有将它存储在变量中,它会在行尾被破坏)。

因为你构建了另一个对象而不是thisthis->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(可能应该是私有方法)中取消初始化,以避免代码重复。