2015-10-20 3 views
0

Рассмотрим следующий класс:Попытка создать список объектов, оператор = дает мне неприятности

class Subject 
{ 

private: 
    char* name; // I must use char pointers, it's for school. 
    int grade; 

public: 
    Subject() { 
     name = NULL; 
     grade = 0; 
    } 
    Subject(char *n, int g) { 
     name = new char[strlen(n)]; 
     strcpy(name,n); 
     grade = g; 
    } 
    ~Subject() { 
     delete name; 
    } 
    void operator=(const Subject &obj) { 
     strcpy(name, obj.name); 
     grade = obj.grade; 
    } 
} 

Так что это довольно простая структура данных со своими специальными функциями. Я новичок , чтобы перегрузить операторы, поэтому он, вероятно, неправильно реализован. Теперь я пытаюсь сделать простой массив этих объектов. Рассмотрим мою основную функцию:

Subject *collection = new Subject[3]; 
char tmp[100]; 
int grade; 

for(int i = 0 ; i < 3; i ++){ 

    cin >> tmp; 
    cin >> grade; 

    collection[i] = new Subject(tmp,grade); 
} 

Это возвращает ошибку, говорящую ни одного совпадения для оператора = в ..etc. Поэтому я понимаю, что они не знают, что делать, когда видят «=», поэтому мне нужно определить его. Как мне это сделать. Опять же, дело в том, чтобы сделать простой список объектов Subject (я не могу использовать вектор, то для школы)

+6

'new Subject' возвращает указатель на динамически выделенный' Subject'. 'new Subject [3]' - массив из 3 объектов Subject (* not * массив из 3 'Subject *'). – crashmstr

+1

Является ли ваш учитель убежденным, что он обучает С ++, между прочим? – Chiel

+2

«Это для школы» - это плохая причина, чтобы не изучать современный C++. – crashmstr

ответ

6
  1. operator= не возвращается тщетным:.

    Subject& operator=(const Subject &obj){ 
        grade = obj.grade; 
        strcpy(name, obj.name); 
        return *this; 
    } 
    
  2. Subject *collection = new Subject[3]; это создает массив из 3 Subjet объектов. Оператор new, однако, возвращает указатель на новый объект, созданный в куче, так:

    collection[i] = new Subject(tmp,grade); 
    \___________/ \____________________/ 
        ^     ^-----a pointer to a Subject object 
        |--object of Subject type 
    

    вы пытаетесь присвоить указатель на объект, который не будет работать. Для того, чтобы сделать вашу operator= работу, вы должны написать collection[i] = Subject(tmp,grade);

  3. Эта линия strcpy(name, obj.name); вызывает неопределенное поведение, если obj.name больше name. Вы должны изменить размер name, прежде чем копировать строки.

  4. Было бы неплохо прочитать о так называемом rule от three. В принципе, если ваш класс определяет деструктор, конструктор копирования или оператор присваивания копии, он, вероятно, должен определить все из них.

+0

Я вижу, вы ничего не говорили о имени в operator = function, только в классе. Почему это? – nhrnjic6

+0

@ nhrnjic6, это была опечатка – SingerOfTheFall

+0

Работает. Я хочу поблагодарить вас, сэр, я знаю, что это боль, связанная с этим основным материалом, но вы мне очень помогли. – nhrnjic6

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