2014-04-03 108 views
0

我很难弄清楚如何正确地重载'='操作员以将一个学生的信息分配给另一个人的任务。我是新来的,所以我可以把它弄糟了。谢谢你的帮助!操作员超载故障

#include <iostream> 

using namespace std; 

class Student 
{ 
    public: 
     void input() 
     { 
      cout << "Please enter student's name: "; 
      cin >> name; 
      cout << "Please enter the number of classes " << name << " is taking: "; 
      cin >> numClasses; 
      classList = new string[numClasses]; 
      cout << "Please enter the list of classes " << name << " is taking: "; 
      for(int i = 0; i < numClasses; i++) 
      { 
       cin >> classList[i]; 
      } 
     } 
     void print() 
     { 
      cout << "Student's name: " << name << endl; 
      cout << "Number of classes " << name << " is taking: " << numClasses << endl; 
      cout << "List of classes " << name << " is taking: " << endl; 
      for(int i = 0; i < numClasses; i++) 
      { 
       cout << classList[i] << endl; 
      } 
     } 
     void resetClasses() 
     { 
      name.clear(); 
      numClasses = 0; 
      delete [] classList; 
     } 
     Student operator= (Student s) 
     { 
      Student temp; 
      temp.name = s.name; 
      temp.numClasses = s.numClasses; 
      temp.classList = s.classList; 
      return temp; 
     } 
    private: 
     string name; 
     int numClasses; 
     string *classList; 
}; 


int main() 
{ 
    Student s1, s2; 

    s1.input(); 
    cout << "Student 1's data:" << endl; 
    s1.print(); 

    s2 = s1; 
    cout << endl << "Student 2's data after assignment from student 1: " << endl; 
    s2.print(); 

    s1.resetClasses(); 
    cout << endl << "Student 1's data after reset:" << endl; 
    s1.print(); 

    cout << endl << "Student 2's data, should still have original classes: " << endl; 
    s2.print(); 
} 
+0

制作'classList'一个'标准::矢量'你不必提供赋值操作符,拷贝构造函数,析构函数,什么... – juanchopanza

+0

你的类没有一个用户定义的析构函数清理内存,更不用说赋值运算符和复制构造函数了。 – PaulMcKenzie

回答

1

实现赋值运算符的正确方法是使用

Student& operator=(const Student& s){ 
    if (&s != this){ 
     this->name = s.name; 
     /*etc for all members*/ 
    } 
    return *this; 
} 

有几件事情需要注意:

  1. s复制由恒定的参考通过。这意味着它不会进行深层复制,也不允许被该函数修改。

  2. 返回*this允许你做多项任务:a = b = c;

  3. if声明避开与自我分配出现的任何问题。

  4. 要特别注意复制classList。确保进行深层复制。

这是迄今为止最好使用标准模板库的容器,所以你可以依靠编译器生成的赋值运算符。

+1

classList是一个指针。它不应该被深拷贝? – fritzone

+0

@fritzone:可能;因此我对所有成员* /'相当模糊的'/ *等。但我觉得这是一个B型问题。让我们先看看赋值运算符的形式。 – Bathsheba