책 정리/Effective C++ 3rd

항목 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해버리자

ocean20 2019. 10. 23. 21:44

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