簡體   English   中英

嘗試創建對象列表,operator =給我帶來麻煩

[英]Trying to create list of objects, operator = is giving me trouble

考慮以下課程:

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中的operator =不匹配。 所以我知道他們在看到'='時不知道該怎么做,因此我需要對其進行定義。 我該怎么做。 再次,重點是列出Subject對象的簡單列表。(我不能使用vector,它用於學校)

  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.name大於name將導致未定義的行為。 復制字符串之前,應相應更改name大小。

  4. 了解所謂的“ 定律 ”將是一個好主意。 基本上,如果您的類定義了析構函數,復制構造函數或復制賦值運算符,則它可能應該定義所有它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM