考虑以下课程:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
因此它具有非常简单的数据结构及其特殊功能.我是新的重载运算符,所以它可能没有正确实现.现在,我尝试做的是创建这些对象的简单数组.考虑我的主要功能:
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);
}
Run Code Online (Sandbox Code Playgroud)
这将返回错误,表示与..etc中的operator =不匹配.所以当他们看到'='时,我知道他们不知道该怎么做,所以我需要定义它.我该怎么做.再一次,重点是制作简单的主题对象列表.(我不能使用矢量,它是为了学校)
不operator=应该返回无效:
Subject& operator=(const Subject &obj){
grade = obj.grade;
strcpy(name, obj.name);
return *this;
}
Run Code Online (Sandbox Code Playgroud)Subject *collection = new Subject[3];这将创建一个包含3个Subjet对象的数组.new但是,运算符返回指向堆上创建的新对象的指针,因此:
collection[i] = new Subject(tmp,grade);
\___________/ \____________________/
^ ^-----a pointer to a Subject object
|--object of Subject type
Run Code Online (Sandbox Code Playgroud)
您正在尝试分配指向对象的指针,但该指针无效.为了使你的operator=工作,你应该写collection[i] = Subject(tmp,grade);
strcpy(name, obj.name);如果obj.name大于,则此行将导致未定义的行为name.您应该name在复制字符串之前相应地更改大小.