试图创建对象列表,操作符=给了我麻烦

Trying to create list of objects, operator = is giving me trouble

本文关键字:麻烦 操作符 创建对象 列表      更新时间:2023-10-16

考虑以下类:

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;
    }
}

是一个非常简单的数据结构,具有特殊的功能。我的新重载操作符,因此可能无法正确实现。现在,我要做的就是把这些对象做成一个简单的数组。考虑我的main函数:

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);
}

返回错误,表示在…等中没有匹配operator=。我知道他们看到'='时不知道该怎么做,所以我需要定义它。我该怎么做呢?同样,重点是制作一个简单的Subject对象列表。(我不能用矢量,这是学校用的)

  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. 如果obj.name大于name, strcpy(name, obj.name);行将导致未定义行为。在复制字符串之前,您应该相应地更改name的大小。

  4. 读一读所谓的"三原则"是个好主意。基本上,如果您的类定义了析构函数、复制构造函数或复制赋值操作符,则可能应该定义所有这些操作符。