Post

[ STUDY/Effective C++ ] 2022. 6. 23. 23:41

항목5를 보면 알 수 있다시피 컴파일러는 클래스에 대해 기본생성자, 복사 생성자, 복사 대입 연산자, 소멸자를 암시적으로 만들 수 있다.

 

그러면 복사가 되지않게 복사 생성자 자체를 만들지 않을 수 없는걸까?

 

1. 해당 멤버함수를 private으로 선언

 

class HomeForSale {
public:
	...

private:
	...
	HomeForSale(const HomeForSale&);
	HomeForSale& operator=(const HomeForSale&);
};

결론은 컴파일러에서 자동으로 생성하는것을 방지하고자하는 멤버함수를 따로 private으로 선언만하고 구현을 하지않으면 되는일이다.

 

2. Uncopyable 상속

class Uncopyable {
protected: 
	Uncopyable() {}//생성과 소멸 허용
	~Uncopyable() {}

private:
	Uncopyable(const Uncopyable&) //복사 방지
	Uncopyable& operator=(const Uncopyable&);
};
class HomeForSale: private Uncopyable {
...
};

아니면 기본 클래스인 Uncopyable 을 상속받으면 되는일이다. 좀 더 깔끔하긴하다.

이 Uncopyable이라는 클래스를 보면  생성과 소멸을 허용하는건 protected내에서 선언을 해준다. 

그리고 앞의 방법과 똑같이 방지가 되었으면 하는 멤버함수의 경우에는 private으로 선언을 한다. 

 

 

3. noncopyable 상속

Uncopyable과 같은 기능을 하나, 부스트 라이브러리안에 있는 클래스이다.

▲ top