本文是大话设计模式的读书笔记,帮助读者从面向过程的编程思想到面向对象的思想的转变,实现从理解C++基本的语法到深入理解面向对象的三大特性--封装、继承和多态,以一个简单的四则运算计算器开始面向对象的旅程。
#include<iostream>
using namespace std;
//运算类
class Operate {
public:
virtual double getResult()=0;
void setNum1(double num1);
void setNum2(double num2);
double getNum1();
double getNum2();
private:
double number1;
double number2;
};
//运算工厂类,通过指向不同的运算类实现调用不同的运算功能
class OperateFactory {
public:
Operate* creatOperate(char type);
};
//加法类
class OperateAdd :public Operate {
public:
virtual double getResult();
};
//减法类
class OperateSub :public Operate {
public:
virtual double getResult();
};
//乘法类
class OperateMul :public Operate {
public:
virtual double getResult();
};
//除法类
class OperateDiv :public Operate {
public:
virtual double getResult();
};
//以下为类外定义的函数
void Operate::setNum1(double num1)
{
number1 = num1;
}
void Operate::setNum2(double num2)
{
number2 = num2;
}
double Operate::getNum1()
{
return number1;
}
double Operate::getNum2()
{
return number2;
}
double OperateAdd::getResult()
{
double result = 0;
result = getNum1() + getNum2();
return result;
}
double OperateSub::getResult()
{
double result = 0;
result = getNum1() - getNum2();
return result;
}
double OperateMul::getResult()
{
double result = 0;
result = getNum1() * getNum2();
return result;
}
double OperateDiv::getResult()
{
double result = 0;
double tmp1 = getNum1();
double tmp2 = getNum2();
if (tmp2 == 0)
cout << "除数不能为0" << endl;
else
result = tmp1/tmp2;
return result;
}
Operate * OperateFactory::creatOperate(char type)
{
Operate* p_Operate;
switch (type)
{
case'+':
p_Operate = new OperateAdd;
break;
case'-':
p_Operate = new OperateSub;
break;
case'*':
p_Operate = new OperateMul;
break;
case'/':
p_Operate = new OperateDiv;
break;
}
return p_Operate;
}
//客户端(主函数)
void main()
{
Operate* oper = NULL;
OperateFactory of;
oper = of.creatOperate('/');
oper->setNum1(10);
oper->setNum2(152);
cout << oper->getResult() << endl;
if (oper != NULL)
{
delete oper;
oper = NULL;
}
system("pause");
}