Effective C++Item 6はどのようにオブジェクトコピー関数を阻止しますか?


本では2つの方法を紹介した.1つ目は簡単で、オブジェクトコピー関数をprotected/privateに直接配置し、実現しない.欠点は、クラスのメンバー関数がオブジェクトコピー関数を呼び出すことができるかどうかですが、link時にエラーが発生します.
class Cat
{
public:
	Cat(){}
	Cat(const string &s, const int &v):name(s), age(v){}

	void CopyCat()
	{
		Cat a;
		Cat b(a);
	}
private:
	string name;
	int age;
	Cat(const Cat &rhs);
	Cat& operator=(const Cat &rhs);
};

2つ目は複雑ですが、compileの時期に間違って報告することができます.privateはUncopyableベースクラスを継承し、ベースクラスのオブジェクトコピー関数はprivate内で実装されていないと宣言します.private継承の役割は、派生クラスがオブジェクトコピー関数にアクセスできないようにすることです.
class Uncopyable
{
protected:
	Uncopyable(){}
	~Uncopyable(){}
private:
	Uncopyable(const Uncopyable &rhs);
	Uncopyable& operator=(const Uncopyable &rhs);
};

template<typename T>
class Dog : private Uncopyable
{
	string name;
	T value;
public:
	
	Dog(const string &s, const int &v):name(s), value(v){}
private:
	//Dog(const Dog<T> &rhs);
	//Dog& operator=(const Dog<T> &rhs);
};

この2つの実装機能は、設計モードの単一モードに似ていますが、単一モードはpublicインタフェース関数によってメンバーオブジェクトを返すポインタです.