#include <iostream> using namespace std; template<typename T> class Operation { public: T NumberA; T NumberB; T NumberResult; void SetNumberA(T A) { NumberA=A; } T GetNumberA() { return NumberA; } void SetNumberB(T B) { NumberB=B; } T GetNumberB() { return NumberB; } virtual T Calculate()=0; virtual void OutPut()=0; }; template<typename T> class OperationAdd:public Operation<T> { public: T Calculate() { NumberResult=NumberA+NumberB; return NumberResult; } void OutPut() { cout<<GetNumberA()<<"+"<<GetNumberB()<<"="<<NumberResult<<endl; } }; template<typename T> class OperationSub:public Operation<T> { public: T Calculate() { NumberResult=NumberA-NumberB; return NumberResult; } void OutPut() { cout<<GetNumberA()<<"-"<<GetNumberB()<<"="<<NumberResult<<endl; } }; template<typename T> class OperationFactory { public: OperationFactory() { oper=NULL; } Operation<T>* oper; void ProduceOperation(char ch) { if(oper!=NULL) delete oper; switch(ch) { case '+': oper=new OperationAdd<T>; break; case '-': oper=new OperationSub<T>; break; default: break; } } }; int main() { OperationFactory<double> operFctory; char ch; double numberA,numberB; do { cout<<"输入操作符:"; cin>>ch; if(ch=='0') break; operFctory.ProduceOperation(ch); cout<<"输入操作数:"; cin>>numberA>>numberB; operFctory.oper->SetNumberA(numberA); operFctory.oper->SetNumberB(numberB); operFctory.oper->Calculate(); operFctory.oper->OutPut(); }while(1); system("pause"); return 0; }