简单介绍:
在头文件runTimeSelectionTables.H中声明了两个很重要的宏:
declareRunTimeSelctionTable(autoPtr, baseType, argNames, argList, parList)
defineRunTimeSelectionTable(baseType, argNames)
这里涉及到一个专业词汇 ”run-time selection table”, 这两个宏的定义就是为了方便实现run-time selection table.
首先要说明的是这两个宏是成对的,也就是在源代码文件中这两个宏也要成对使用,一般将第一个宏放在头文件中,而第二个宏放在相应的c文件中。一个为声明另一个是定义实现。
详细描述
Ø declareRunTimeSelectionTable
该宏具有5个参数:autoPtr,baseType,argNames,argList,parList。
首先,利用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
该宏仅有两个参数:baseType,argNames。
首先通过定义以下三个“子宏”来实现该宏的定义:
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。
评论