HomeForSale h1;
HomeForSale h2;
HomeForSale h3(h1); // h1을 복사하려 한다. - 컴파일이 되면 안된다.
h1 = h2; // h2를 복사 하려 한다. - 컴파일이 되면 안된다.
HomeForSale h2;
HomeForSale h3(h1); // h1을 복사하려 한다. - 컴파일이 되면 안된다.
h1 = h2; // h2를 복사 하려 한다. - 컴파일이 되면 안된다.
해결 방법
- 컴파일러가 생성하는 복사 생성자와 복사 대입 연산자는 public 으로 자동 생성 해버리므로 이들을 private 멤버로 선언 하면 된다.
ㄴ 효과1 : 클래스 멤버 함수가 명시적으로 선언되어 컴파일러는 자시느이 기본 버전을 만들 수 없다.
ㄴ 효과2 : 비공개(private) 접근성을 가지므로 외부에서 호출 할 수 없게 된다.
- private 멤버 함수는 그 클래스의 멤버 함수 및 프렌드 함수가 호출 할 수 있으므로 함수 자체를 정의를 하지 않으면 된다.
ㄴ 효과1 : 멤버 함수 및 프렌드 함수 까지의 접근을 완벽히 차단할 수 있다.
위의 꼼수는 [멤버 함수를 private 멤버로 서언하고 일부러 정의(구현)하지 않는 방법] 은 꽤 널리 퍼지면서 하나의 '기법' 화가 되어 C++의 iostream 라이브러리에 속한 몇몇 클래스에서도 복사 방지책으로 쓰이고 있다.
class HomeForSale {
public:
...
private:
...
HomeForSale(const HomeForSale&); // 선언만 되어 있다.
HomeForSale& operator=(const HomeForSale);
}
public:
...
private:
...
HomeForSale(const HomeForSale&); // 선언만 되어 있다.
HomeForSale& operator=(const HomeForSale);
}
이것만은 잊지 말자!
- 컴파일러에서 자동으로 제공하는 기능을 허용치 않으려면, 대응되는 멤버 함수를 private로 선언한 후에 구현은 하지 않은 채로 두자. Uncopyable과 비슷한 기본 클래스를 쓰는것도 한 방법이다.
관련링크
http://ikpil.tistory.com/407
http://yesarang.tistory.com/42
http://ikpil.tistory.com/318
'Programming > Effective C++ 3판' 카테고리의 다른 글
항목 11. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자 (0) | 2009.02.17 |
---|---|
항목 10. 대입 연산자는 *this 참조자를 반환하게 하자 (0) | 2009.02.15 |
항목 9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자. (0) | 2009.02.15 |
항목 8. 예외가 소멸자를 떠나지 못하도록 붙들여 놓자. (0) | 2008.07.10 |
항목 7. 다형성을가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자. (0) | 2008.07.01 |
항목 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자. (0) | 2008.06.27 |
항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2008.06.27 |
항목 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자. (0) | 2008.06.10 |
항목 3. 낌새만 보이면 const를 들이대 보자! (0) | 2008.06.10 |
항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자. (0) | 2008.05.29 |
항목 1. C++를 언어들의 연합체로 바라보는 안목은 필수 (1) | 2008.05.28 |
댓글을 달아 주세요