c++ 实现工厂模式

        工厂模式大家都很熟悉了,就是利用多态,利用基类指针指向新生成的派生类,用该指针调用派生类的函数。

今天看《effective c++》写代码主要是练习一下,代码中类实现没有考虑太多的构造函数及虚构函数,各位见谅。

       

#include<iostream>
#include<string>
using namespace std;


class Operation
{
public:
	void setNumA(double d1)
	{
		numA = d1;
	}
	void setNumB(double d2)
	{
		numB = d2;;
	}
	double getNumA() const
	{
		return numA;
	}
	double getNumB() const
	{
		return numB;
	}
	double virtual getResult() = 0;
private:
	double numA;
	double numB;
};

class OperationAdd : public Operation
{
public:
	double getResult();
};

double OperationAdd::getResult()
{
	return getNumA() + getNumB();
}

class OperationSub : public Operation
{
public:
	double getResult();
};
double OperationSub::getResult()
{
	return  getNumA() - getNumB();
}

class OperationMul : public Operation
{
public:
	double getResult();	
};

double OperationMul::getResult()
{
	return getNumA() * getNumB();
}

class OperationDiv : public Operation
{
public:
	double getResult();
};

double OperationDiv::getResult()
{
	if (getNumB() == 0)
	{
		cout << " the divisor can't be zero " << endl;
		throw runtime_error("the divisor can't be zero");
	}
	return getNumA() / getNumB();
}

class OperationFactory
{
public:
	static Operation * createOperation(char operate)
	{
		Operation *oper;
		switch(operate)
		{
		case '+' :
			oper = new OperationAdd;
			break;
		case '-':
			oper = new OperationSub;
			break;
		case '*':
			oper = new OperationMul;
			break;
		case '/':
			oper = new OperationDiv;
			break;
		default:
			cout << " can't reconginze the operate " << endl;
			oper = 0;
		}
	return oper;
	}
};


int main()
{
	double numA;
	double numB;
	char operate;
	cout << " Please input two params " << endl;
	cout << " numA = ";
	cin >> numA;
	cout << " numB = ";
	cin >> numB;
	OperationFactory factory;

	cout << "Please input operate : ";
	cin>> operate;

	Operation *operation = factory.createOperation(operate);
	operation->setNumA(numA);
	operation->setNumB(numB);
	cout << " The result of " << numA << " " << operate <<"  " << numB << " = " << operation->getResult() << endl;

	delete operation;
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值