正文

runtimeSelctionTable宏2009-02-01 08:32:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/bioexplore/40690.html

分享到:

简单介绍

在头文件runTimeSelectionTables.H中声明了两个很重要的宏:

declareRunTimeSelctionTable(autoPtr, baseType, argNames, argList, parList)

defineRunTimeSelectionTable(baseType, argNames)

这里涉及到一个专业词汇 ”run-time selection table”, 这两个宏的定义就是为了方便实现run-time selection table.

首先要说明的是这两个宏是成对的,也就是在源代码文件中这两个宏也要成对使用,一般将第一个宏放在头文件中,而第二个宏放在相应的c文件中。一个为声明另一个是定义实现。

 

详细描述

Ø         declareRunTimeSelectionTable

该宏具有5个参数:autoPtrbaseTypeargNamesargListparList

首先,利用typedef定义一个函数指针类型 argNamesConstructorPtr,返回值为autoPtr<baseType>,参数为argList

接着,利用该函数指针通过typedef定义一个HashTable类型:argNamesConstructorTable,该HashTable的模板参数分别为<argNamesConstructorPtr, word, string::hash>;

接着,定一个静态argNamesConstructorTable型的指针变量:argnamesConstructorTablePtr_;

定义一个模板类:addargNamesConstructorToTable,模板参数为baseTypeType,该类中一个静态成员函数New,一个构造函数和一个析构函数。New的参数列表为argList,返回值是autoPtr<baseType>,实际上是调用autoPtr<baseType> (new baseTypeType parList)。构造函数有一个参数(const word& lookup=baseTypeType::typeName),调用了下面声明的全局函数constructargNamesConstructorTables()之后,利用argNamesConstructorTabelPtr_的成员函数insert,将(lookup, New)插入到argNamesConstructorTablePtr_中,析构函数则直接调用全局函数destroyargNamesConstructorTables();

声明一个在上述模板类构造中用到的静态全局函数:constructargNamesConstructorTables()

声明一个在上述模板类析构中用到的静态全局函数:destroyargNamesConstructorTables()

至此,整个宏的定义结束。

综上所述,该宏主要是声明一个模板类addargNamesConstructorToTable<baseTypeType>,只要在使用了该宏的代码中定义一个该模板类的具现类的对象,就将调用该模板类的构造函数(唯一的默认构造函数),这样就实现了将New函数插入到所定义的HashTable型的全局静态变量:argNamesConstructorTablePtr_

 

Ø         defineRunTimeSelectionTable

该宏仅有两个参数:baseTypeargNames

首先通过定义以下三个“子宏”来实现该宏的定义:

defineRunTimeSelectionTablePtr(baseType, argNames)

defineRunTimeSelectionTableConstructor(baseType, argNames)

defineRunTimeSelectionTableDestructor(baseType, argNames)

 

下面对其分别描述如下:

l         defineRunTimeSelectionTablePtr(baseType, argNames)

该宏主要就是为前面通过declare宏声明的静态argNamesConstructorTablePtr_变量赋值为NULL

l         defineRunTimeSelectionTableConstructor(baseType, argNames)

该宏实现前面通过declare宏声明的静态全局函数constructargNamesConstructorTables(), 其关键代码为:为静态的argNamesConstructorTablePtr_变量赋值为new baseType::argNamesConstructorTable; 也就是为argNamesConstructorTablePtr_指向一块保存一个HashTable<argNamesConstructorPtr, word, string::hash>对象的内存。

l         defineRunTimeSelectionTableDestructor(baseType, argNames)

该宏实现前面通过declare宏声明的静态全局函数destroyargNamesConstructorTables(), 其关键代码为:判断argNamesConstructorTablePtr_是否为NULL,如果为否证明cosntruct已经运行,则delete baseType::argNamesConsstructorTablePtr_, 并令其等于NULL

阅读(3971) | 评论(2)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册