Effective C++Item 6はどのようにオブジェクトコピー関数を阻止しますか?
本では2つの方法を紹介した.1つ目は簡単で、オブジェクトコピー関数をprotected/privateに直接配置し、実現しない.欠点は、クラスのメンバー関数がオブジェクトコピー関数を呼び出すことができるかどうかですが、link時にエラーが発生します.
2つ目は複雑ですが、compileの時期に間違って報告することができます.privateはUncopyableベースクラスを継承し、ベースクラスのオブジェクトコピー関数はprivate内で実装されていないと宣言します.private継承の役割は、派生クラスがオブジェクトコピー関数にアクセスできないようにすることです.
この2つの実装機能は、設計モードの単一モードに似ていますが、単一モードはpublicインタフェース関数によってメンバーオブジェクトを返すポインタです.
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インタフェース関数によってメンバーオブジェクトを返すポインタです.