[转]boost 中的noncopyable

关键字:noncopyable; NonCopyable;

 

前记:今日研究mangos服务器的源代码,发现了个熟练的NonCopyable类。

 

今日粗看boost的代码,发现很多类都继承noncopyable,以下是noncopyable的代码:
class noncopyable
  {
   protected:
      noncopyable() {}
      ~noncopyable() {}
   private:  // emphasize the following members are private
      noncopyable( const noncopyable& );
      const noncopyable& operator=( const noncopyable& );
  };

这里的设计思想是让子类继承,但是阻止子类调用赋值和copy构造函数,有什么用呢?
写代码的时候我经常喜欢用singleton模式,比如那些工厂类,管理者类之类的,但是写这些
singleton的时候当然是希望全局只有一个,而且不希望别人在用的时候又自己创造一个,往往
就要每写一个singleton类就要在类的declaration中把它们的构造函数,赋值函数,析构函数,copy构造函数隐藏到
private或者protected之中,这样真的很累。
  现在好了,只要让这些singleton直接继承noncopyable就ok了。这样至少可以不用多写赋值和copy构造
函数了;构造和析构函数看情况而定了。

class noncopyable的基本思想是把构造函数和析构函数设置protected权限,这样子类可以调用,但是外面的类不能调用,
那么当子类需要定义构造函数的时候不至于通不过编译。但是最关键的是noncopyable把copy构造函数和copy赋值函数做成了
private,这就意味着除非子类定义自己的copy构造和赋值函数,否则在子类没有定义的情况下,外面的调用者是不能够通过
赋值和copy构造等手段来产生一个新的子类对象的。举个简单的例子:
class Test : public noncopyable
{
};

void main()
{
   Test a,c;
   Test b(a);  ///<------(1) error

   c = a;     ///<------(2) error
}

如果Test类没有继承 noncopyable,那么(1)和(2)都可以通过编译,但是一旦Test继承了noncopyable,则(1)和(2)都通不过
编译,从而可以防止调用者写一些错误的代码,这不正是我们做singleton对象所需要的吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值