[英]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,它用於學校)
operator=
不應返回void:
Subject& operator=(const Subject &obj){ grade = obj.grade; strcpy(name, obj.name); return *this; }
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);
這行strcpy(name, obj.name);
如果obj.name
大於name
將導致未定義的行為。 復制字符串之前,應相應更改name
大小。
了解所謂的“ 三 定律 ”將是一個好主意。 基本上,如果您的類定義了析構函數,復制構造函數或復制賦值運算符,則它可能應該定義所有它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.