#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<stdexcept>
using namespace std;
//业务的封装过程让业务逻辑与界面逻辑分开,从而使程序容易修改、易于复用
//通过类的封装、继承、多态将程序的耦合度降低
//Operation运算类
class Operation
{
private:
double number_A = 0;
double number_B = 0;
public:
Operation() {}
Operation(double a, double b)
{
number_A = a;
number_B = b;
}
double getNumberA()
{
return number_A;
}
void setNumberA(double a)
{
number_A = a;
}
double getNumberB()
{
return number_B;
}
void setNumberB(double b)
{
number_B = b;
}
//利用多态性实现业务
virtual double getResult()
{
double result = 0;
return result;
}
};
//加减乘除类
class Add :public Operation
{
public:
virtual double getResult()
{
return getNumberA() + getNumberB();
}
};
class Sub :public Operation
{
public:
virtual double getResult()
{
return getNumberA() - getNumberB();
}
};
class Mul :public Operation
{
public:
virtual double getResult()
{
return getNumberA() * getNumberB();
}
};
class Dev :public Operation
{
public:
virtual double getResult()
{
if (getNumberB() == 0)
{
throw overflow_error("除数为零!!!");
}
return getNumberA() / getNumberB();
}
};
//工厂类的实现,依赖于运算类
class OperationFactory
{
public:
static Operation* createOperatecreate(char operate)
{
//c++不支持对字符串进行switch case操作
Operation *oper = NULL;
switch (operate)
{
case '+':
oper = new Add;
break;
case '-':
oper = new Sub;
break;
case '*':
oper = new Mul;
break;
case '/':
oper = new Dev;
default:
break;
}
return oper;
}
};
void test(double a, char op, double b)
{
Operation *oper;
oper = OperationFactory::createOperatecreate(op);
oper->setNumberA(a);
oper->setNumberB(b);
cout << oper->getResult() << endl;
}
int main()
{
try
{
test(10.1, '/', 0);
}
catch (overflow_error &e)
{
cout << e.what() << endl;
}
system("pause");
return EXIT_SUCCESS;
}