2014-04-03 5 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'를'std :: vector '로 만들고 할당 연산자, 복사 생성자, 소멸자 등을 제공 할 필요가 없습니다. – juanchopanza

+0

클래스에는 메모리를 정리할 사용자 정의 소멸자가 없습니다. 할당 연산자와 복사 생성자는 말할 것도 없습니다. – PaulMcKenzie

답변

1

대입 연산자를 구현하는 올바른 방법은주의하는 것이

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

몇 가지를 사용하는 것입니다

  1. 일정 참조에 의해 전달되는 복사하는 s. 이는 딥 카피 (copy)를 취하지 않으며 함수에 의해 수정 될 수 없다는 것을 의미합니다.

  2. 돌아 *this은 여러 과제를 수행 할 수 있습니다 a = b = c;

  3. if 문이 자동 할당에서 발생하는 모든 문제를 우회.

  4. classList의 복사에 특히주의하십시오. 깊은 사본이 취해 지도록하십시오.

그러나 그것은 당신이 컴파일러 생성 대입 연산자에 의존 할 수 있도록 표준 템플릿 라이브러리 컨테이너를 사용하는 것이 훨씬 낫다.

+1

classList는 포인터입니다. 깊은 복사를하면 안됩니까? – fritzone

+0

@fritzone : 아마도 가능합니다. 그러므로 모든 회원들에 대한 나의 모호한'/ * 등 * /'. 그러나 나는 이것이 b-type 질문이라고 느꼈다. 할당 연산자의 형식을 먼저 정렬 해 봅시다. – Bathsheba