C++ 宏定义动态加载、工厂模式
来源:互联网 发布:linux临时设置环境变量 编辑:程序博客网 时间:2024/03/29 20:10
#include <string>
#include <map>
#include <iostream>
using namespace std;
typedef void* (*CreateClass)(void);
/*@类工厂,通过一个MAP成员来实现类名与类的实例化对象函数的映射
* * @向外部提供一个接口函数,通过类名来创建该类对象
* * @MAP是静态的,这样可以在程序运行前就可以存在
* */
class ClassFactory
{
public:
static void* GetClassByName(string className)
{
map<string,CreateClass>::const_iterator iter;
iter = m_classMap.find(className);
if(iter==m_classMap.end())
{
return NULL;
}
else
{
return iter->second();
}
}
static void RegistClass(string name,CreateClass method)
{
m_classMap.insert(pair<string,CreateClass>(name,method));
}
private:
static map<string,CreateClass> m_classMap;
};
map<string,CreateClass> ClassFactory::m_classMap;
/*@动态创建类,动态创建的类通过包含该类的一个静态对象
* *向类工厂里注册自己的创建对象函数
* */
class GenDynamic
{
public:
GenDynamic(string name,CreateClass method)
{
ClassFactory::RegistClass(name,method);
}
};
/*@定义宏,类通过包含该宏,实现动态创建*/
#define DECLARE_RUNTIME(class_name)\
string class_name##Name;\
static GenDynamic* class_name##gd
/*@宏实现,类通过实现该宏,实现动态创建*/
#define IMPLEMENT_RUNTIME(class_name)\
GenDynamic* class_name::class_name##gd\
= new GenDynamic(#class_name,class_name::CreateInstance);
/*@顶层父类*/
class AppServer
{
private:
DECLARE_RUNTIME(AppServer);
public:
AppServer()
{
}
static void* CreateInstance()
{
return new AppServer;
}
virtual void display()
{
cout<<"AppServer display()"<<endl;
}
};
IMPLEMENT_RUNTIME(AppServer)
class ChangeBackground:public AppServer
{
private:
DECLARE_RUNTIME(ChangeBackground);
public:
ChangeBackground()
{
}
static void* CreateInstance()
{
return new ChangeBackground;
}
virtual void display()
{
cout<<"ChangeBackground display()"<<endl;
}
};
IMPLEMENT_RUNTIME(ChangeBackground)
class login:public AppServer
{
private:
DECLARE_RUNTIME(login);
public:
login()
{
}
static void* CreateInstance()
{
return new login;
}
virtual void display()
{
cout<<"login display()"<<endl;
}
};
IMPLEMENT_RUNTIME(login)
int main()
{
string str = "login";
AppServer* p = (AppServer*)ClassFactory::GetClassByName(str);
p->display();
return 0;
}
#include <map>
#include <iostream>
using namespace std;
typedef void* (*CreateClass)(void);
/*@类工厂,通过一个MAP成员来实现类名与类的实例化对象函数的映射
* * @向外部提供一个接口函数,通过类名来创建该类对象
* * @MAP是静态的,这样可以在程序运行前就可以存在
* */
class ClassFactory
{
public:
static void* GetClassByName(string className)
{
map<string,CreateClass>::const_iterator iter;
iter = m_classMap.find(className);
if(iter==m_classMap.end())
{
return NULL;
}
else
{
return iter->second();
}
}
static void RegistClass(string name,CreateClass method)
{
m_classMap.insert(pair<string,CreateClass>(name,method));
}
private:
static map<string,CreateClass> m_classMap;
};
map<string,CreateClass> ClassFactory::m_classMap;
/*@动态创建类,动态创建的类通过包含该类的一个静态对象
* *向类工厂里注册自己的创建对象函数
* */
class GenDynamic
{
public:
GenDynamic(string name,CreateClass method)
{
ClassFactory::RegistClass(name,method);
}
};
/*@定义宏,类通过包含该宏,实现动态创建*/
#define DECLARE_RUNTIME(class_name)\
string class_name##Name;\
static GenDynamic* class_name##gd
/*@宏实现,类通过实现该宏,实现动态创建*/
#define IMPLEMENT_RUNTIME(class_name)\
GenDynamic* class_name::class_name##gd\
= new GenDynamic(#class_name,class_name::CreateInstance);
/*@顶层父类*/
class AppServer
{
private:
DECLARE_RUNTIME(AppServer);
public:
AppServer()
{
}
static void* CreateInstance()
{
return new AppServer;
}
virtual void display()
{
cout<<"AppServer display()"<<endl;
}
};
IMPLEMENT_RUNTIME(AppServer)
class ChangeBackground:public AppServer
{
private:
DECLARE_RUNTIME(ChangeBackground);
public:
ChangeBackground()
{
}
static void* CreateInstance()
{
return new ChangeBackground;
}
virtual void display()
{
cout<<"ChangeBackground display()"<<endl;
}
};
IMPLEMENT_RUNTIME(ChangeBackground)
class login:public AppServer
{
private:
DECLARE_RUNTIME(login);
public:
login()
{
}
static void* CreateInstance()
{
return new login;
}
virtual void display()
{
cout<<"login display()"<<endl;
}
};
IMPLEMENT_RUNTIME(login)
int main()
{
string str = "login";
AppServer* p = (AppServer*)ClassFactory::GetClassByName(str);
p->display();
return 0;
}
0 0
- C++ 宏定义动态加载、工厂模式
- PolicyManager工厂模式与动态加载
- DAO,接口,工厂模式,java类的动态加载,ioc
- 工厂模式定义
- 工厂模式定义
- 工厂模式定义
- ClassLoader 动态加载定义
- 动态的工厂模式
- 工厂模式-C-工厂方法
- 设计模式学习(二):接口的作用1-动态加载实例-简单工厂模式
- 工厂模式(c++)
- C#-简单工厂模式
- C#-工厂方法模式
- 工厂模式 (C#)
- 【C#】简单工厂模式
- 工厂模式(C++)
- 【C#】简单工厂模式
- 工厂模式(C++)
- AbstractList 抽象类 源代码
- Android源码分析-资源加载机制解析
- 一些知识点的初步理解_2(流形学习,ing...)
- 【日常学习】【数学】【众数】codevs4419 FFF团卧底的菊花题解
- 高端的N 校联考题
- C++ 宏定义动态加载、工厂模式
- C#程序员开发WinForm必须知道的 Window 消息大全
- UVALive 3635-Pie-二分
- 火星人
- qt5.5.1在Cortex-a8上移植记录
- 使用PullToRefresh实现下拉刷新和上拉加载
- hdu 2803 The MAX
- OpenCV函数速查
- Android程序运行的Dalivk和Java程序运行的JVM虚拟机的区别?