2016-11-26 3 views
0

Я пишу программу, которая будет умножать матрицу с помощью потоков. У меня проблема с заполнением динамического массива int (не может использовать вектор).C++ fill dynamic array 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++; 
    } 
} 

часть ХПП файла:

private: 
    int n_; // columns 
    int m_; // rows 
    int *mac_; 

От отладки я получаю:

это 0x0079f7b0 {П- = 3 m_ = 2 mac_ = 0x00000000 { }}

Я знаю, что могу написать mac_ = new int(n_*m_); во втором конструкторе, но я хочу знать, почему 1-й не работает.

+0

«Использование 1-го ..» Создает временный объект, а не выделение для предполагаемого объекта – Jonas

+0

Вы можете использовать делегированные конструкторы – Jonas

+0

@ Jonas, он не может использовать делегированный конструктор, так как он сначала должен использовать 'istream', указанный как аргумент для получения параметров конструкции. Хорошая старая функция 'init' здесь лучше подходит – wasthishelpful

ответ

2
// ... 

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]; 
} 

Примечание: здесь я достаньте inititialization в функции init (вероятно, следует частный метод), чтобы избежать дублирования кода.

 Смежные вопросы

  • Нет связанных вопросов^_^