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;
}

本文介绍了如何使用map实现C++类的动态创建,作为MFC CRuntimeClass的一种简单替代方案。讨论了在静态变量初始化顺序不确定性导致的问题,并提出通过静态成员函数确保class_set的正确初始化。同时,提出了在不同编译单元中调用create方法可能出现的问题及临时解决方案。
最低0.47元/天 解锁文章
174

被折叠的 条评论
为什么被折叠?



