看了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; //操作数NumberA
double NumberB; //操作数NumberB
public:
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); //设置运算符A
ope->setNumB(numB); //设置运算符B
cout<<ope->getresult()<<endl; //输出结果
return 0;
}