map实现c++中的反射(粗略)

来源:互联网 发布:php简易查询系统源码 编辑:程序博客网 时间:2024/06/04 18:18

  看了c#中的反射机制,感觉这个真的好方便啊,然后也想在c++里面实现一个这样的功能,于是在网上看到别人的方法,就是用map来存放类名(字符串)和函数指针,在使用的时候直接用这个字符串来找这个函数指针,执行这个函数。

  俗话说,心动不如行动,于是我便将之前简单工厂模式的那个例子拿过来修改,将原来的switch判断符号来实例化算法类更改,使用map将‘+’、‘-’、‘*’、‘/’与具体的算法生产函数绑定。

  做完后,感觉功能是实现了,但是总感觉怪怪的,在添加一个算法的时候,需要添加这个算法的生产函数,而且要更改原来的map添加函数,这样的话就破坏了开放-封闭原则,但是我也想不出来其他的办法,暂且先做这样,等以后再回来研究吧。

#include <iostream>#include <string> #include <exception>#include <map>using namespace std;class Operate;typedef Operate* (*createclass)(void);//函数指针声明  用于指向创建加减乘除生产函数class Operate//算法类基类{double NumberA;//操作数NumberAdouble NumberB;//操作数NumberBpublic:void setNumA(double A){NumberA = A;}//NumberA赋值void setNumB(double B){NumberB = B;}//NumberB赋值double getNumA(){return NumberA;}//获取NumberA值double getNumB(){return NumberB;}  //获取NumberB值virtual double getresult()//虚函数  用于实现多态  实现派生类的getresult()函数{double result;return result;}  };class OperateADD : public Operate//加法算法类{double getresult(){double result;double numA = this->getNumA(); double numB = this->getNumB();result = numA + numB;return result;} }; class OperateSUB : public Operate//减法算法类{double getresult(){double result;double numA = this->getNumA(); double numB = this->getNumB();result = numA - numB;return result;}};class OperateMUL : public Operate//乘法算法类{double getresult(){double result;double numA = this->getNumA(); double numB = this->getNumB();result = numA * numB;return result;}};class OperateDIV : public Operate//除法算法类{double getresult(){double result;double numA = this->getNumA();double numB = this->getNumB();try{if(numB == 0)//除数为0时 抛出异常{throw "除数不能为0!";}else{result = numA / numB;return result;}}catch(const char* msg){cout<<msg<<endl;}}};Operate* my_ADD()//加法生产函数{return (new OperateADD);}Operate* my_SUB()//减法生产函数{return (new OperateSUB);}Operate* my_MUL()//乘法生产函数{return (new OperateMUL);}Operate* my_DIV()//除法生产函数{return (new OperateDIV);}class IFactory//算法工厂类{map<string, createclass> m_map;//map容器 存放算法生产函数的指针map<string, createclass>::iterator it;//map容器迭代器public:IFactory()//构造函数  将加减乘除符号和算法生产函数指针保存{m_map.insert(pair<string, createclass>("+",&my_ADD));m_map.insert(pair<string, createclass>("-",&my_SUB));m_map.insert(pair<string, createclass>("*",&my_MUL));m_map.insert(pair<string, createclass>("/",&my_DIV));}Operate* getclassbyname(string str)//由给定的运算符调用对应的算法生产函数{it = m_map.find(str);//查找对应运算符的字段if ( it == m_map.end() ) {return NULL ;  }else {return it->second() ;  }}};int main(){double numA, numB;string oper;cout<<"请输入数字A:";cin>>numA;cout<<"请输入运算符(+、-、*、/):";cin>>oper;cout<<"请输入数字B:";cin>>numB;IFactory* factory = new IFactory();//定义工厂类Operate* ope = factory->getclassbyname(oper);//由运算符生成算法类ope->setNumA(numA);//设置运算符Aope->setNumB(numB);//设置运算符Bcout<<ope->getresult()<<endl;//输出结果return 0;}


0 0