-
Effective C++...5일지 2022. 6. 3. 16:03
컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자
private으로 선언 후 정의를 하지 않는 방법
복사 생성자와 복사 대입 연산자를 private 내부에서 선언하면 컴파일러가 자동 생성하지 않는다.
또, friend를 통해 사용하고자 하더라도 정의가 되어 있지 않으므로 링크 에러가 발생한다.
class HomeForSale {
public:
...
private:
...
HomeForSale(const HomeForSale&);
HomeForSale& operator=(const HomeForSale&);
}
링크 에러를 컴파일 시점 에러로 옮기기
복사를 방지하는 상위 클래스를 만들어 상속받으면 friend에서도 복사 관련 함수에 접근할 수 없게 되어 링크 에러 대신 컴파일 에러가 발생하게 된다.
class Uncopyable {
protected: // 파생된 객체에 대해 생성, 소멸은 허용한다.
Uncopyable() {}
~Uncopyable() {}
private: // 하지만 복사는 막는다.
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
}
class HomeForSale : private Uncopyable {};
※ 부스트 라이브러리에서 Uncopyable과 동일한 기능을 하는 noncopyable 클래스를 지원한다.