Q. 나는 유일한 존재다. 그래서 나를 클래스화했을때 나를 복제(복사생성자 or 복사대입자)해선 안된다라고 가정했을때, c++에서 어떤 방법으로 이 문제를 풀수 있을까?
답변전에 확인한가지 해보자.
컴파일러가 암시적으로 생성하는 함수들(항목5에있음)은 모두 public멤버이다.
우리가 위함수를 명시하면, 컴파일러는 암시적함수생성을 포기한다.
그런데 우리가 이 함수를 명시할때, 어떤누구도 public을 꼭써야만해 라고 말한사람이없다.
답변1.
A. private로 선언하자, 이경우 이 함수들이 비공개의 접근성을가지므로 외부의 호출을막을수 있다. ->90%정답
다시의문을가져보자.
Q. 그 클래스의 멤버함수나, friend 함수를 사용하면 이를 막을수없다. 어떻게?!
A. private 로 선언한 함수의 정의를 하지않는것이다.
결국, 사용자가 객체의복사를 시도할때, 링커가 거부할것이다.
답변2.
위 답변의 링크시점의 에러를 컴파일러시점으로 땡길수있다.
위내용처럼 복사생성자,대입자를 private로 선언하되, 이것을 별도의 클래스에 넣고, 이것으로 부터 상속시키는것이다.
말이쫌어렵다.
class Uncopyable
{
protected:
Uncopyable() {}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operatpr=(const Uncopyable&);
};
이렇게하고
class Me : Uncopyable
{
...
}
요렇게 사용하면 생성자와 소멸자는 파생시키되, 복사생성자,대입자는 공개되어있지않기때문에 호출을 방지할수있다.
마지막으로,Uncopyable의 구현과 사용법에대해 기술적으로 미묘한부분을 짚고넘어가야하는데,
아직배우지않았으므로 추후 업데이트하도록하겠다.TODO
'책 정리 > Effective C++ 3rd' 카테고리의 다른 글
항목 4. 객체를 사용하기 전에 반드시 그 객체를 초기화하자 (0) | 2019.12.15 |
---|---|
항목 3. 낌새만 보이면 const를 들이대 보자! (0) | 2019.12.10 |
항목 2. #define을 쓰려거든 const, enum, inline을 떠올리자 (0) | 2019.12.04 |
항목 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2019.10.23 |
항목 7. 다형성을 가진 기본클래스에서는 소멸자를 반드시 가상소멸자로 선언하자 (0) | 2019.10.22 |
댓글