Post List

2015년 1월 4일 일요일

Compiler 가 만든 함수가 필요없으면, 확실히 금지시키자.

 * Compiler에서 자동으로 제공하는 기능을 허용치 않을려면, 대응되는 멤버 함수를 private로 선언한 후에 구현은 하지 않은 채로 두십시오. Uncopyable과 비슷한 기본 Class를 쓰는 것도 한 방법입니다.

 특정 Class의 Object들은 절대로 복사되지 않아야 한다면, 복사생성자와 대입연산자의 사용을 막아야 한다. 하지만 이 둘은 Compiler에 따라 자동으로 만들어지는 경우가 있기 때문에 사용할 수 없도록 만들어야 한다.

class C {
private:
    C(const C&);            // 선언만 달랑 있음
    C& operator=(const C&); // 사용한다면 Link 오류가 남
};

 하지만 Link 시점의 오류를 Compile 시점의 오류로 옮기면 좀 더 좋지 않을까 ? 그럴려면 이것을 구현할려는 Class 자체에 넣지말고 별도의 복사방지 Class를 만드러서 상속하는 게 좋다.


class Uncopyable {
protected:
    Uncopyable() {}                 // 생성과 소멸은 허용하지만
    ~Uncopyable() {}
private:
    Uncopyable(const Uncopyable&);  // 복사는 방지
    Uncopyable& operator=(const Uncopyable&);
};

class C : private Uncopyable { ... }; // 복사생성자, 대입연산자가 선언되지 않음



 참고로 부스트 라이브러리에 noncopyable 이라는 Class가 있는데 위에 소개한 Uncopyable 과 같은 역할을 하게 해주므로 활용해 보는 것도 좋다.

댓글 없음:

댓글 쓰기