转载:http://www.seacha.com/article.php/knowledge/cbase/2013/0615/2154.html
主要思想:在每次创建类的过程中,通过各自类的辅助类(所以每个类必须包含IMPLEMENT_DYNCRT_BASE)向基类通过“注册函数'注册,然后通过重载“工厂函数”,在创建类时,自身创建类。这里函数指针的使用非常重要。
#include <map> #include <string> #define DECLEAR_DYNCRT_BASE(CBase) \ public: \ typedef CBase *(*ClassGen)(); /* 声明函数指针*/ \ static CBase *Create(const string &class_name) /* 工厂函数 */ \ { \ std::map<string, ClassGen>::iterator iter = m_class_set.find(class_name); \ if (m_class_set.end() != iter) \ { \ return ((*iter).second)(); \ } \ return NULL; \ } \ protected: \ static void Register(const string &class_name, ClassGen class_gen) /* 注册函数 */ \ { \ m_class_set.insert(map<string, ClassGen>::value_type(class_name, class_gen)); \ } \ static std::map<string, ClassGen> m_class_set /* 存储子类信息 */ // 用于实现基类 #define IMPLEMENT_DYNCRT_BASE(CBase) \ std::map<string, CBase::ClassGen> CBase::m_class_set #define DECLEAR_DYNCRT_CLASS(CDerived, CBase) \ public: \ struct CDerived##Register /* 辅助类,用于注册 */ \ { \ CDerived##Register() \ { \ static bool bRegistered = false; /* 注册子类,只注册一次 */ \ if(!bRegistered) \ { \ CBase::Register(#CDerived, CDerived::Create); /* 注册子类信息 */ \ bRegistered = true; \ } \ } \ }; \ static CBase *Create() /* 工厂函数 */ \ { \ return new CDerived; \ } \ static struct CDerived##Register m_t##CDerived##Register // 用于实现一个能被动态创建的类 #define IMPLEMENT_DYNCRT_CLASS(CDerived) \ static CDerived::CDerived##Register m_t##CDerived##Register class CBase { DECLEAR_DYNCRT_BASE(CBase); DECLEAR_DYNCRT_CLASS(CBase, CBase); public: virtual void Print() { std::cout << "This is base!" << std::endl; } }; IMPLEMENT_DYNCRT_BASE(CBase); IMPLEMENT_DYNCRT_CLASS(CBase); class TEST: public CBase { DECLEAR_DYNCRT_CLASS(TEST, CBase); public: virtual void Print() { cout << "This is test!" << endl; } }; IMPLEMENT_DYNCRT_CLASS(TEST); int main() { CBase* base = CBase::Create("TEST"); if (base) { base->Print(); } return 0; }