2015-10-20 33 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); 
} 

這將返回錯誤說沒有對手對於運營商=在...等。所以我知道當他們看到'='時他們不知道該怎麼做,所以我需要定義它。我該怎麼做。再次,關鍵是使主題對象的簡單列表(我不能用向量,它是學校)

+6

'new Subject'返回一個指向動態分配的'Subject'的指針。 'new Subject [3]'是一個由3個'Subject'對象組成的數組(*不是* 3個'Subject *'的數組)。 – crashmstr

+1

順便說一句,您的老師是否確信自己在教C++? – Chiel

+2

「這是學校」是不得不學習現代C++的一個不好的理由。 – crashmstr

回答

6
  1. operator=不應該返回void:

    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.namename大。在複製字符串之前,您應該相應地更改name的大小。

  4. 閱讀關於three的所謂rule將是一個好主意。基本上,如果你的類定義了析構函數,複製構造函數或複製賦值運算符,它可能應該定義所有這些。

+0

我看到你沒有在operator = function中說出任何關於名字的東西,只有等級。這是爲什麼? – nhrnjic6

+0

@ nhrnjic6,這是一個錯字 – SingerOfTheFall

+0

它的工作原理。我想感謝你,先生,我知道這是處理這些基本問題的痛苦,但你幫了我很多。 – nhrnjic6