类和枚举的对应方法(重构)

来源:互联网 发布:淘宝店铺升级公示期 编辑:程序博客网 时间: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

原创粉丝点击