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

时间:2015-10-20 13:07:07

标签: 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;
    }
}

因此它具有非常简单的数据结构及其特殊功能。我是新人        重载运算符,因此可能没有正确实现。        现在,我尝试做的是创建这些对象的简单数组。        考虑我的主要功能:

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;时他们不知道该怎么做,所以我需要定义它。我该怎么做。同样,重点是制作简单的主题对象列表。(我不能使用矢量,它适用于学校)

1 个答案:

答案 0 :(得分:6)

  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. 阅读所谓的rule three是个好主意。基本上,如果您的类定义了析构函数,复制构造函数或复制赋值运算符,它可能应该定义所有这些。