2015-10-20 39 views
0

考虑下面的类:试图创建对象的列表,运营商=在给我找麻烦

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

这将返回错误说没有对手对于运营商=在...等。所以我知道当他们看到'='时他们不知道该怎么做,所以我需要定义它。我该怎么做。再次,关键是使主题对象的简单列表(我不能用向量,它是学校)

+6

'new Subject'返回一个指向动态分配的'Subject'的指针。 'new Subject [3]'是一个由3个'Subject'对象组成的数组(*不是* 3个'Subject *'的数组)。 – crashmstr

+1

顺便说一句,您的老师是否确信自己在教C++? – Chiel

+2

“这是学校”是不得不学习现代C++的一个不好的理由。 – crashmstr

回答

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.namename大。在复制字符串之前,您应该相应地更改name的大小。

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

+0

我看到你没有在operator = function中说出任何关于名字的东西,只有等级。这是为什么? – nhrnjic6

+0

@ nhrnjic6,这是一个错字 – SingerOfTheFall

+0

它的工作原理。我想感谢你,先生,我知道这是处理这些基本问题的痛苦,但你帮了我很多。 – nhrnjic6