现在的位置: 首页 > 综合 > 正文

运行时类型信息–RTI的一个简单实现

2013年10月08日 ⁄ 综合 ⁄ 共 3112字 ⁄ 字号 评论关闭
 

相信使用过C# 的朋友应该都会对运行时类型(Type) 很熟悉,在面向对象的编程中它能够给我们提供很多方便,它可以检测出实例对象的类型,避免类型转换错误,它提供的功能当然不止这个,如果有兴趣大家可以详细看看C#中的Type类。可是在C++中就没有这个好东西了,那么就让我们自己来给我们的C++程序制作一个“Type”类吧!在下面我将会提供Type类的一个最简单实现以及一个初始化类型例子。

 

#include "stdafx.h"
//包含map 和 vector 头文件
#include <map>
#include <vector>
 
struct TypeData;
//定义 Type map 类型
typedef std::map<char*, int> TYPEMAP;
//定义Type list 类型
typedef std::vector<TypeData> TYPEDATALIST;
 
class Type
{
public:
            //创建一个类型,下面将提供它的实现
            static Type CreateType(Type parent, char *name);
            //得到一个空类型
            static Type GetNullType();
            //是否继承自参数中的类型
            int IsDeriveFrom(Type type) const;
            //得到父类类型
            Type GetParent() const;
 
private:
            //类型名字
            char *m_pName;
            //是否为空类型
            int m_nIsNullType;
            //类型的索引
            int m_nIndex;
           
            static int ms_nIndex;
            //类型数据列表,用于存储整个程序的类型数据
            static TYPEDATALIST ms_TypeData;
            ////类型字典,用于存储整个程序的类型名字,和类型列表示一一对应的。
            static TYPEMAP ms_TypeMap;
};
//类型数据,在这里只包含了自身类型和其父类类型
struct TypeData
{
            Type type;
            Type parent;
};
下面大家就来看看怎么创建一个类型:
Type
Type::CreateType(Type parent, char *name)
{
            //检测该类型是否已经存在了
            TYPEMAP::iterator it;
            it = Type::ms_TypeMap.find(name);
            if(it != Type::ms_TypeMap.end())
            {
                        return Type::ms_TypeData[it->second].type;
            }
 
            //全局索引加1
            ++Type::ms_nIndex;
           
            //创建新类型
            Type t;
            t.m_nIsNullType = 1;
            t.m_pName = name;
            t.m_nIndex = Type::ms_nIndex;
 
            //创建新类型数据
            TypeData td;
            td.parent = parent;
            td.type = t;
 
            //保存新类型及其数据
            Type::ms_TypeData.push_back(td);
            Type::ms_TypeMap.insert(TYPEMAP::value_type(name, Type::ms_nIndex));
 
            return t;
}
在上面我们已经创建了类型,现在我们就来看一个初始化类型的例子吧!该例子非常简单,只是单纯的把父类和其子类的类型进行了初始化,初始化之后接下来的程序就能使用了,大家要注意的一点是使用这种方法大家就必须要保证在开始程序之前就要对所有的类型进行初始化,这是非常必要的一步。下面请看代码:
class BaseClass
{
public:
            BaseClass(){}
 
            static Type GetType();
            static void InitClass();
            static void InitClasses();
private:
            static Type ms_type;
};
 
Type BaseClass::ms_type;
 
Type
BaseClass::GetType()
{
            return ms_type;
}
 
void
BaseClass::InitClass()
{
            BaseClass::ms_type = Type::CreateType(Type::GetNullType(), "BaseClass");
            printf("Initialize BaseClass type/n");
}
 
 
class DeriveClass : public BaseClass
{
public:
            DeriveClass() {}
 
            static Type GetType(){return ms_type;}
            static void InitClass();
private:
            static Type ms_type;
};
 
Type DeriveClass::ms_type;
 
void
DeriveClass::InitClass()
{
            DeriveClass::ms_type = Type::CreateType(BaseClass::GetType(), "DeriveClass");
            printf("Initialize DeriveClass type/n");
}
void
BaseClass::InitClasses()
{
            DeriveClass::InitClass();
}
 
class ApplicationContext
{
public:
            static void InitClasses()
            {
                        BaseClass::InitClass();
 
                        BaseClass::InitClasses();
            }
};
int _tmain(int argc, _TCHAR* argv[])
{
            ApplicationContext::InitClasses();
            return 0;
}
程序比较简单,我就不解释了,大家看一下就应该能懂。

 

抱歉!评论已关闭.