조항12: 대상을 복제할 때 각 성분을 잊지 마라

잘 설계된 대상 시스템은 대상의 내부를 봉하여 두 개의 함수를 남겨서 대상 복사를 담당하는 것을 말한다. 그것이 바로 적당한 명칭을 가진copy구조함수와copyassignment조작부호이다. 우리는 이것을copying함수라고 부른다.
고객을 나타내는 클래스를 고려하여 수동으로 코핑 함수를 작성합니다.

  
  
  
  
  1. void logCall(const std::string& funName);// log entry  
  2. class Customer  
  3. {  
  4. public:  
  5.   ...  
  6.   Customer(const Customer& rhs);  
  7.   Customer& operator=(const Customer& rhs);  
  8.   ...  
  9. private:  
  10.   std::string name;  
  11. }; 
  12. Customer::CUstomer(const Customer& rhs):name(rhs.name) 
  13.   logCall("Customer copy constructor"); 
  14. Customer& Customer::operator=(const Customer& rhs) 
  15.   logCall("Customer copy assignment operator"); 
  16.   name = rhs.name; 
  17.   return *this

이상은 옳습니다.
데이터를 추가하는 경우:

  
  
  
  
  1. class Date{...};//  
  2. class Customer 
  3. public
  4.   ... //  
  5. private
  6.   std::string name; 
  7.   Date lastTransaction; 
  8. }; 

이때copying은 국부 복사를 실행합니다. 고객의name를 복사했지만,lastTransaction에 새로 추가된 값이 없습니다. 대부분의 컴파일러들은 경고를 하지 않습니다.클라스에 구성원 변수를 추가하려면copying 함수를 동시에 수정해야 합니다.
상속될 경우 잠재적인 위기가 발생할 수 있습니다.

  
  
  
  
  1. class PrioCustomer:public Customer 
  2. public
  3.   ... 
  4.   PrioCustomer(const PrioCustomer& rhs); 
  5.   PrioCustomer& operator=(const PrioCustomer& rhs); 
  6.   ... 
  7. private
  8.   int prio; 
  9. }; 
  10. PrioCustomer::PrioCustomer(const PrioCustomer& rhs):prio(rhs.prio) 
  11.   logCall("PrioCustomer copy constructor"); 
  12. PrioCustomer& PrioCustomer::operator=(const PrioCustomer& rhs) 
  13.   logCall("PrioCustomer copy assignment operator"); 
  14.   prio = rhs.prio; 
  15.   return *this

보아하니 Prio Customer 내의 모든 데이터를 복제한 것 같지만, 모든 Prio Customer에는 상속된 Customer 구성원 변수가 포함되어 있지만, 그 변수는 부여되지 않았다.
상속 클래스의 copying 함수를 해당 기본 클래스 함수로 호출해야 합니다.

  
  
  
  
  1. PrioCustomer::PrioCustomer(const PrioCustomer& rhs) 
  2.  :Customer(rhs),prio(rhs.prio) 
  3.   logCall("PrioCustomer copy constructor"); 
  4. PrioCustomer& PrioCustomer::operator=(const PrioCustomer& rhs) 
  5.   logCall("PrioCustomer copy assignment operator"); 
  6.   Customer::operator=(rhs); 
  7.   prio = rhs.prio; 
  8.   return *this

copying 함수를 작성하면, 모든local 구성원 변수를 복사하고, 모든 기본 클래스의 적절한copying 함수를 호출하는지 확인하십시오.
copy assignment 조작부호를copy 구조 함수로 호출하는 것은 불합리합니다.
코피 구조 함수를 코피 assignment 조작부호로 호출하는 것도 불합리하다.
만약 당신의copy구조 함수와copyassignment 조작부호가 비슷한 코드를 가지고 있다는 것을 발견한다면, 중복 코드를 제거하는 방법은 새로운 구성원 함수를 만들어서 둘을 호출하는 것이다. 이런 함수는private이며, 흔히 init라고 명명된다.
 
1. Copying 함수는'대상 내의 모든 구성원 변수'와'모든 기류 성분'을 복제해야 한다.
2. 어떤copying함수로 다른copying함수를 실현하려고 시도하지 말고 공통기능을 세 번째 함수에 놓고 두 개의copying함수로 공통적으로 호출해야 한다.
 
 

좋은 웹페이지 즐겨찾기