MFC的CRuntimeClass利用链表实现了C++类的动态创建。但是如果项目中对动态创建的要求比较低,我们完全可以利用map实现简单的动态创建。以下三个文件做了一个简单的实现。
/*
* Author: yejingx
* Date: 2011-12-29
* File: base.h
*/
#ifndef BASE_H_
#define BASE_H_
#include "dyncreate.h"
class base
{
public:
typedef base* (*class_creator)(); // 声明类的创建函数指针
static base* create(const std::string& class_name); // 由类名创建类
static std::map<const std::string,class_creator> class_set; // 保存类名与类创建函数
struct _auto_register // 用于自动注册
{
_auto_register(const std::string& name, base::class_creator creator){
base::class_set.insert(std::pair<const std::string,base::class_creator>(name,creator));}
};
public:
base(void);
virtual ~base(void);
virtual void run();
};
#endif
/*
* Author: yejingx
* Date: 2011-12-29
* File: base.cpp
*/
#include <iostream>
#include "base.h"
std::map<const std::string,base::class_creator> base::class_set;
base* base::create(const std::string& class_name) // 动态创建函数实现
{
std::map<const std::string,base::class_creator>::iterator it;
it = class_set.find(class_name); // 在map中查找类名
if(it != class_set.end()){
return (it->second)();
}
return NULL;
}
base::base(void){
std::cout<<"base constructor called"<<std::endl;
}
base::~base(void){
std::cout<<"base destructor called"<<std::endl;
}
void base::run(){
std::cout<<"base class run"<<std::endl;
}