简单介绍: 在头文件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。

评论