尝试创建对象列表,operator =给我带来了麻烦

nhr*_*ic6 0 c++

考虑以下课程:

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 =不匹配.所以当他们看到'='时,我知道他们不知道该怎么做,所以我需要定义它.我该怎么做.再一次,重点是制作简单的主题对象列表.(我不能使用矢量,它是为了学校)

Sin*_*all 6

  1. operator=应该返回无效:

    Subject& operator=(const Subject &obj){
        grade = obj.grade;
        strcpy(name, obj.name);
        return *this;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)

    您正在尝试分配指向对象的指针,但该指针无效.为了使你的operator=工作,你应该写collection[i] = Subject(tmp,grade);

  3. strcpy(name, obj.name);如果obj.name大于,则此行将导致未定义的行为name.您应该name在复制字符串之前相应地更改大小.

  4. 阅读所谓的法则是一个好主意.基本上,如果您的类定义了析构函数,复制构造函数或复制赋值运算符,它可能应该定义所有这些.