首先我们要明确,编译器产出的所有函数都是public,因此将成员函数声明为private且故意不去实现他们可以阻止编译器为你自动生成你不想要的函数。但我们在member函数或friend函数中使用该函数时,那么会在连接时发生错误,我们可以将错误迁移至编译阶段,此时的方法就是专门设计一个阻止拷贝动作的基类,这个基类的实现如下:
class Uncopyable{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
然后让我们想实现的类继承这个基类,就可以任何阻止拷贝动作。因为当任何对象(包括member和friend函数)尝试拷贝我们实现的对象时,编译器试着生成一个拷贝构造函数和赋值操作符,这些函数的编译器生成版会调用其基类的对应兄弟,但由于其基类的拷贝构造函数和赋值操作符是private,则编译器就会拒绝该操作。
读到此处我想起了一个问题,如何设计一个仅有一个实例的类,那么就可以将该类的构造函数声明为private,并声明该类的一个指针为static并且是private成员,并在public中返回一个接口指向该指针。同时为了保证正确delete该指针可以设计一个辅助类,在其析构函数中删除,并且在private中声明该辅助类的一个static实例,由于C++在结束时会释放所有静态成员,所以当该类要被delete时,他的private静态成员会被释放,析构函数被调用,从而删除了该唯一的实例。