类和枚举的对应方法(重构)
来源:互联网 发布:淘宝店铺升级公示期 编辑:程序博客网 时间:2024/04/26 20:13
点评原型到几种方法:
1.函数指针类型
2.工厂模型
3.宏的方法使用
4.静态函数的使用
5.静态成员变量的使用
静态成员变量的定义后,仍然需要在cpp中引用之。
如:factory* factory::instance = new factory();
6.map方法的使用
//stdafx.h-----------------------------------------------------------------------------
#ifndef _FACTORY_
#define _FACTORY_
//在每一个类的定义中声明一个静态函数
#define DECLARE_DYNCREATE(class_name) /
static Base* CreateObject()/
{/
return new class_name##();/
}
//注册一个类的静态函数
#define REGCLASS(id, class_name)/
factory::m_ClassMap[id] = &(class_name::CreateObject);
#include <stdio.h>
#pragma warning(disable:4786)
#include <map>
using namespace std;
//各个类对应的枚举值
enum ClassId
{
CsubCommId = 0,
CSubAcId,
CsubCfId,
};
//Base基类
class Base
{
public:
virtual void print()
{
return;
}
};
//Base的继承类
class CSubCommon:public Base
{
public:
//使用宏来声明一个类的静态函数,静态函数用来产生该类的对象
DECLARE_DYNCREATE(CSubCommon)
void print()
{
printf("CSubCommon./n");
}
};
//Base的继承类
class CSubAc:public Base
{
public:
//使用宏来声明一个类的静态函数,静态函数用来产生该类的对象
DECLARE_DYNCREATE(CSubAc)
void print()
{
printf("CSubAc./n");
}
};
//Base的继承类
class CSubCf:public Base
{
public:
//使用宏来声明一个类的静态函数,静态函数用来产生该类的对象
DECLARE_DYNCREATE(CSubCf)
void print()
{
printf("CSubCf./n");
}
};
//声明函数指针类型,此类型用于定义个MAP类型的成员变量
typedef Base* (*CreateObj)();
class factory
{
public:
//函数为工厂类中生产对象的函数。
Base* CreateObjFum(int id);
static factory* Instance()
{
return instance;
}
//此map的作用用于存储,枚举值和类的静态函数指针的对应关系。
map<int, CreateObj> m_ClassMap;
private:
static factory* instance;
factory();
~factory();
};
#endif
// stdafx.cpp : -----------------------------------------------------------------------------
#include "stdafx.h"
Base* factory::CreateObjFum(int id)
{
map<int, CreateObj>::iterator it = factory::m_ClassMap.find(id);
if (it == factory::m_ClassMap.end())
{
return NULL;
}
else
{
return it->second();
}
}
factory::factory()
{
REGCLASS(CsubCommId, CSubCommon)
REGCLASS(CSubAcId, CSubAc)
REGCLASS(CsubCfId, CSubCf)
}
factory* factory::instance = new factory();
factory::~factory()
{
if (instance != NULL)
{
delete instance;
instance = NULL;
}
}
//main.cpp-----------------------------------------------------------------------------
#include "stdafx.h"
int main(int argc, char* argv[])
{
factory::Instance()->CreateObjFum(CsubCommId)->print();
factory::Instance()->CreateObjFum(CSubAcId)->print();
factory::Instance()->CreateObjFum(CsubCfId)->print();
return 0;
}
运行效果:
CSubCommon.
CSubAc.
CSubCf.
Press any key to continue
- 类和枚举的对应方法(重构)
- 代码中坏味道和对应重构方法——摘自《重构,改善既有代码的设计》
- 枚举类的方法
- 代码重构的方法和意义
- 重构代码的思路和方法
- 取对应枚举的值
- 获取枚举的对应值
- IO 流 四个抽象类和对应的抽象方法
- Java web 开发中利用枚举类来记录错误码和错误码对应的错误信息
- 72 Java 枚举类(3)枚举类的Field、方法和构造器
- 参数可变的方法和枚举
- 定义枚举的构造方法和字段
- 枚举的总结和常用方法
- 枚举和枚举类
- Java如何根据类名和方法名创建类的实例,并调用对应方法?
- 根据枚举值得到对应的枚举名
- 【软件工程】开发项目重构的时机和方法
- C/C++枚举enum分别打印输出枚举子和枚举值的方法
- 编译安装ibus输入法
- C4TAT2
- redhat 中文乱码解决方法
- javascript设计模式_第二部分_装饰者模式
- linux route 命令
- 类和枚举的对应方法(重构)
- dom 学习笔记
- 感冒的感觉
- 深入理解和改进JSP/Servlet会话管理机制
- 关于Perl的传入参数
- 博客地址(持续添加ing)
- 原来地球真的离谁都可以转!
- 硬盘安装Opensuse11.1
- Ethtool设置网卡参数的命令