在c++中,有的时候需要限制某种类型的对象的拷贝复制,例如std::thread, std::metux,std::ifstream, std::ofstream等类型。
什么时候需要去如此设计该类型呢?实际上就是如果一个对象涉及到一种唯一资源的管理时,我们需要设计为该类型,例如前面所举例子: 分别管理线程资源,互斥区和文件;如果我们设计为可以随意拷贝复制的,那么会导致存在多个物体同时管理一个资源,必然导致混乱。
那么如何设计呢?通常是将构造函数设计为protected或private即可。如果使用boost, 则可以直接继承boost::nocopyable类即可;
namespace noncopyable_ // protection from unintended ADL
{
class noncopyable
{
protected:
noncopyable() {}
~noncopyable() {}
private:
// emphasize the following members are private
noncopyable( const noncopyable& );
noncopyable& operator=( const noncopyable& );
};
typedef noncopyable_::noncopyable noncopyable;
};
同时,需要注意,如果一个类中包含不可拷贝复制的对象实例时,该类自然也是不可拷贝复制的。
如果避免呢?实际上只要使用指针或共享指针或唯一指针即可避免,同时,可以避免多个对象实例管理相同资源。