C++中常用的几个小技巧

来源:互联网 发布:网络推广多少钱一年 编辑:程序博客网 时间:2024/06/05 01:18

也许只是一些技巧而已,不过值得反复重用就变成语言的 Idioms了。说到Idioms,POSA认
为 Pattern 可以分为三个层次(或者粒度) ,Architecture patterns、Design patterns、Programming
language Idioms。也就是说Idioms很多是跟语言相关的。 
 
1、实现抽象类(不允许实例化) 
这个可能大家都知道,把构造函数声明为 protected。 (当然如果类中包含纯虚函数自然就不
能实例化,但是有的抽象类需要为虚函数提供缺省实现,因此可能不包含纯虚函数。 )  
 
2、实现 final类(不允许被派生) 
namespace Private{
class NonDerivableHelper
{
        NonDerivableHelper() {}
        friend class NonDerivable;
};
}
#ifdef NDEBUG
#define FINAL_CLASS
#else
#define FINAL_CLASS : private virtual Private::NonDerivableHelper
#endif
 
class NonDerivable FINAL_CLASS
{
    ...
};
  这里 namespace 并非必须,只是一个比较好的习惯而已。

3、实现禁止拷贝构造和赋值操作符 
class MyClass 

private:
MyClass(const MyClass& ); 
const MyClass& operator = ( const MyClass& ); 
};
为了防止成员函数调用操作,这两个函数应该只有声明没有实现。 
 
C++中的 Idioms很多很多,比如 TypeTraits、SmartPointer这些都可以视为经典的 Idioms。
注: 关于第二个实现 final类的方式, 只要是 virtual 继承即可, 至于是private、 protected
还是public关系不大。在 comp.lang.c++.moderated(2001/5/15)上,Andrei Alexandrescu有他
的见解,他不赞成上面文章中使用的 friend-based 方式,直接去掉 friend 那一行,这时必须采用
private virtual 继承方式。private virtual 继承确实使得没有任何类能只继承
NonDerivable。
 
class D: public NonDerivable
{
  D() {} //编译错误
}
 
不过多重虚拟继承又绕了过去
class D FINAL_CLASS, public NonDerivable
{
  D() {} //一切正常
}
 
  Andrei Alexandrescu又提出了一个非常巧妙的办法: 把 Private::NonDerivableHelper
的构造函数加一个参数,改为 NonDerivableHelper(int) {},然后把 NonDerivable 的
构造函数写成 NonDerivable(): NonDerivableHelper(0) {}
 
#ifdef NDEBUG
#define FINAL_CLASS
#else
#define FINAL_CLASS : private virtual Private::NonDerivableHelper
#endif
 
namespace Private
{
    class NonDerivableHelper
    {
    protected:
        NonDerivableHelper(int) {} //ADDED CTOR ARGUMENT
    };
}
 
class NonDerivable FINAL_CLASS
{
public:
  NonDerivable() : NonDerivableHelper(0) {} //PASS A DUMMY VALUE
};

原创粉丝点击