2015-11-03 1 views
0

Мне нужна помощь, пытаясь заставить это работать должным образом. Предполагается, что программа отображает номера массивов и число 78 для одного из индексов. Я не получаю ошибок компилятора при попытке запустить его, но он мгновенно закрывается из программы.Попытка исправить мои заметки по классу

class Vector 
{ 
public: 
    Vector (int number_of_elements); 
    int num; 
    int *p; 
}; 

int main() 
{ 
    Vector va(10); 

    va.p = new int[va.num]; 

    for (int i = 0; i < va.num; i++) 
    { 
     va.p[i]=i; 

     for (int i = 0; i < va.num; i++) 
     { 
      cout << va.p[i] << endl; 
     } 
    } 
    Vector vb(va); 


    vb.p[0] = 78; //if you switch these 3 lines with the 3 above 78 gets printed out everyline 
    for (int i = 0; i < vb.num; i++) 
    { 
     cout << vb.p[i] << endl; 
    } 
    return 0; 
} 

Vector::Vector(int number_of_elements) 
{ 
    num = number_of_elements; 
} 
+1

Возможно, это мгновенно закрывает программу, потому что программа закончилась слишком быстро. Почему бы не добавить ключ для чтения или что-то подобное в конце main(), поэтому программа ждет нажатия клавиши, так что у вас есть время, чтобы увидеть результат? – Pavlin

+2

Я не вижу никаких вопиющих ошибок, но (i) почему бы не инициализировать буфер данных 'p' в конструкторе, (ii)« удалить »любую память, выделенную в деструкторе, (iii) знать, что' vb (va) 'будет принимать только мелкую копию' va'. – Bathsheba

ответ

1

С кодом возникает множество проблем.

Во-первых, как сообщают @Pavlin, добавьте нажатие клавиши, чтобы остановить завершение консоли.

У вас есть утечка памяти. У вас есть

va.p = new int[va.num]; 
you have to delete it like this 
delete[] va.p 

Вторая проблема здесь:

Vector vb(va); 

Этот оператор создает объект из существующего объекта. Он использует специальную функцию, называемую конструктором копирования. Поскольку у вас есть память распределяется динамически, вы должны предоставить вам собственный конструктор копирования, как это:

Vector(const& Vector tmp) { // code here); 

иначе он копирует указатель, а не значение. Его мелкая копия, но вам нужна глубокая копия,

И очень рекомендуется, что при использовании указателей внутри класса добавьте деструктор для удаления выделенной памяти.

+1

hahaha да, что я имел в виду, позвольте мне отредактировать его: P – KostasRim

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