考虑以下课程:
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 =不匹配。所以我知道当他们看到&#39; =&#39;时他们不知道该怎么做,所以我需要定义它。我该怎么做。同样,重点是制作简单的主题对象列表。(我不能使用矢量,它适用于学校)
答案 0 :(得分:6)
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
大小。
阅读所谓的rule three是个好主意。基本上,如果您的类定义了析构函数,复制构造函数或复制赋值运算符,它可能应该定义所有这些。