#include #include #include #include
using namespace std;
class Cal { public: virtual int getResult() = 0; int num1; int num2; };
class AddCal :public Cal { public: virtual int getResult() { return num1 + num2; } }; class SubCal :public Cal { public: virtual int getResult() { return num1 - num2; } }; class MulCal :public Cal { public: virtual int getResult() { return num1 * num2; } }; class DivCal :public Cal { public: virtual int getResult() { return num1 / num2; } };
class AbsFactory { public: virtual Cal* Operator() = 0;
};
class AddFactory :public AbsFactory { public: Cal* Operator() { return new AddCal; } }; class SubFactory :public AbsFactory { public: Cal* Operator() { return new SubCal; } }; class MulFactory :public AbsFactory { public: Cal* Operator() { return new MulCal; } }; class DivFactory :public AbsFactory { public: Cal* Operator() { return new DivCal; } };
//IOC���� template class IOC { public: template void input(string key) { if (m.find(key) == m.end()) { function<T* ()> f = { return new x; }; m[key] = f; }
} T* getType(string key) { if (m.find(key) != m.end()) { function<T* ()> f = m[key]; return f(); } }private: map<string, function<T* ()>> m; };
int main() { int num1, num2; cin >> num1; cin >> num2;
string op; cin >> op; //Cal* cal = OperatorFactory::Operator(op); /* AbsFactory* factory; if (op == "+") { factory = new AddFactory; } else if (op == "-") { factory = new SubFactory; } else if (op == "*") { factory = new MulFactory; } else if (op == "/") { factory = new DivFactory; } Cal* cal = factory->Operator(); */ IOC<AbsFactory> c; c.input<AddFactory>("+"); c.input<SubFactory>("-"); c.input<MulFactory>("*"); c.input<DivFactory>("/"); AbsFactory* factory = c.getType(op); Cal* cal = factory->Operator(); cal->num1 = num1; cal->num2 = num2; cout << cal->getResult() << endl; return 0;}