楼主
发表于:
2004-04-20 12:15:55
//File: class.h
#ifndef __CLASS_H__ #define __CLASS_H__
#include <string> #include <map>
typedef void* (*FactoryMethod)(void); class Registry;
/* * 这个类是用来存储<name, create object function>对, * 也就是个对象工厂. */ class Class { public: static Class forName(std::string name) { return Class(name); } public: void* newInstance(void) { std::map<std::string, FactoryMethod>::const_iterator find; find = registry.find(name); if (find == registry.end()) return NULL; else return (find->second)(); } private: friend class Registry; static bool registerClass(std::string name, FactoryMethod method) { return registry.insert(std::make_pair(name, method)).second; } private: static std::map<std::string, FactoryMethod> registry; std::string name; explicit Class(std::string n) : name(n) {} };
std::map<std::string, FactoryMethod> Class::registry;
class Registry { public: Registry(const char* name, FactoryMethod method) { Class::registerClass(name, method); } };
/* * mixed template, generate new instance for every class. */ template <class T, const char name[]> class Registed { public: static void* newInstance(void) { return new T(); } protected: Registed() { const Registry& dummy = r; } private: static const Registry r; };
/* * static member, initiliazed before enter into main() * call Class::registerClass by ctor of Registry */ template <class T, const char name[]> const Registry Registed<T, name>::r = Registry(name, Registed<T, name>::newInstance);
#define REG_CLASS(CLASS) \ char NameArray[] = #CLASS; \ class CLASS : public Registed<CLASS, NameArray> \
#endif // __CLASS_H__
// Class.cc #include <iostream> #include "Class.h"
REG_CLASS(Test) { public: Test() { std::cout << "Test" << std::endl; } };
int main(int argc, char* argv[]) { Class c = Class::forName("Test"); void* p = c.newInstance(); system("pause"); return 0; }
编译环境: DEV C++, windows 2000 server. 运行结果: Test
让我奇怪的是模板类Registed中的protected构造器, 他到底起什么作用? 如果把这个构造器去掉,编译能够通过, 但运行没有结果,原因是Registed中的static member没有初始化, 从而Registry的构造器没有运行..
|