oo中的优质代码,单例模式、类的静态函数指针实现RTTI
本人对其进行裁剪,简单直接代码展现,把5个函数用宏的形式封装,便于插进代码中使用
typedef void* (*TypeId)();
#define TYPEINFO() \
static void* CreateType() { return 0; } \
static TypeId StaticType() { return &CreateType; } \
virtual TypeId Type() const { return &CreateType; } \
static bool IsOf( TypeId aSameOrSuperType ) \
{ \
if ( aSameOrSuperType == StaticType() ) \
return true; \
return false; \
} \
virtual bool IsA( TypeId aSameOrSuperType ) const \
{ return IsOf( aSameOrSuperType ); }
#define TYPE(sType) (sType::StaticType())
#define PTR_CAST( T, pObj ) \
( pObj && (pObj)->IsA( TYPE(T) ) ? (T*)(pObj) : 0 )
#define HAS_BASE( T, pObj ) \
( pObj && (pObj)->IsA( TYPE(T) ) )
#define IS_TYPE(T,pObj) \
( pObj && (pObj)->Type() == TYPE(T) )
使用方法,如下 IS_TYPE()用于判定是否该类型,PTR_CAST()进行动态类型转换
class Base
{
public:
TYPEINFO();
};
class Derived : public Base
{
public:
TYPEINFO();
};
//测试用例
Base *pbase1 = new Base;
Base *pbase2 = new Derived;
cout << IS_TYPE(Base,pbase1) << endl; //1
cout << IS_TYPE(Derived,pbase1) << endl; //0
Base *pbase3 = new Base;
Derived *pderived3 = PTR_CAST(Derived,pbase3); //faild NULL
Base *pbase4 = new Derived;
Derived *pderived4 = PTR_CAST(Derived,pbase4); //successful
我们让问题复杂一点,再添加一个派生类时
class DDerived : public Derived
{
public:
TYPEINFO();
};
//复杂一点的测试用例
Derived *pderived5 = new DDerived;
Base *pbase5 = pderived5;
Derived *pbase6 = PTR_CAST(Derived,pbase5); //faild, return NULL
但是这个时候,我们并不希望转换失败,因为这个转换根本没有任何问题!
缺少的仅仅是DDerived到Derived转换的支持
解决方法是,在IsOf添加一次判定SuperType,让其成功转换
具体实现可以用宏,再插入IsOf中间
#define SUPERTYPE(sSuper) \
if ( sSuper::IsOf(aSameOrSuperType ) ) \
return true
其完整代码,不再赘述
oo代码简单、高效,实为我辈范例!
本文参考Oo的RTTI:http://hg.services.openoffice.org/cws/sw34bf06/file/12fa3ee3d107/tools/inc/tools/rtti.hxx