2015-04-10 6 views
0

У меня проблемы с упражнением для школы, в котором нам нужно использовать динамическое распределение для массива char и массива int. Главное, что Я не должен менять основную функцию и способ построения объектов.Как использовать конструктор копирования с динамическим распределением?

class Automobile 
{ 
char* Name; //this is the name of the car that needs to be saved with dynamic alloc. 
int* Reg; //registration with dynamic alloc. 
int speed; //speed of the car 
public: 
Automobile(){ speed=0;} 
Automobile(char* name,int* Reg,int speed) 
{ 
    Name=new char[strlen(name)+1]; 
    strcpy(Name,name); 
    Reg = new int[5]; 
    for(int i=0;i<5;i++) 
    { 
     this->Reg[i]=Reg[i]; 
    } 
    this->speed=speed; //the normal constructor doesn't make any problems since it's called once 
} 
Automobile(const Automobile& new) 
{ 
    Name= new char[strlen(new.Name)+1]; 
    strcpy(Name,new.Name); 
    Reg=new int[5]; 
    for(int i=0; i<5; i++) Reg[i]=new.Reg[i]; 
    speed=new.speed; 
} 

~Automobile(){ 
    delete [] Name; 
    delete [] Reg; 
} 
int main() 
{ 
int n; 
cin>>n; 

for (int i=0;i<n;i++) 
{ 
    char name[100]; 
    int reg[5]; 
    int speed; 

    cin>>name; 

    for (int i=0;i<5;i++) 
     cin>>reg[i]; 

    cin>>speed; 

    Automobile New=Automobile(name,reg,speed); 

} 

в основной функции, объект Новый воссоздан (??) цикл так, конструктор копирования называется (я не уверен в этом). В конструкторе копирования я не удаляю память (должен ли я?), поэтому отладчик показывает мне, что есть проблема в строке, где я делаю Новая память для имени. Я попытался добавить delete [] Name и сохранить имя другого объекта во временном указателе, чтобы я мог повторно назначить имя во временное, но это тоже не работает. Компилятор не обнаруживает никаких ошибок при его создании, но на странице, которую я должен сохранить упражнение, показано, что у меня есть bad_alloc (я не уверен, что это связано с указателем копирования).

+4

Вы ** действительно ** не должны назвать свою переменную 'new', что это ключевое слово ++ C. – CoryKramer

+0

Это не называется новым, я просто изменил их имена на английском языке, чтобы они могли быть более понятными .. – Bonne

+0

Вы должны прочитать это: [Что такое правило из трех] (http://stackoverflow.com/questions/4172722/ то, что-это-заместитель правило троих). –

ответ

0

Это, в конструкторе три параметра

Reg = new int[5]; 

присваивает параметр функции, а не к члену.
Это приводит к тому, что член не инициализируется (потому что вы его не инициализируете), что заставляет копировать массив в произвольное место, которое может или не может потерпеть неудачу.
Если это не так, то delete в деструкторе, скорее всего, не удастся.

Хорошим решением является не повторное использование имен членов для чего-то еще в той же области (в этом случае переименуйте параметры).
Тогда отказ от this-> не только не катастрофа, но даже рекомендуется.

Вы также забыли инициализировать элементы указателя в конструкторе по умолчанию.

Примечание стороны: канонический способ создания и инициализации объекта является

Automobile New(name,reg,speed); 
+0

Когда я инициализирую их в конструкторе по умолчанию, я просто даю им значение NULL? – Bonne

+0

@Bonne Вы можете сделать это, так как безопасно удалять нулевой указатель, но тогда ваш конструктор копий должен проверить нуль в оригинале, и вам, вероятно, потребуется проверить больше мест, если программа будет расти. Вероятно, проще просто указать имя в пустой строке или строку, которая означает «no name» и «Reg» при некорректной числовой последовательности. Или вы можете просто оставить конструктор по умолчанию. – molbdnilo

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