BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #74806同步于 2013/10/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请教一个C++实现“工厂模式”时遇到的问题

cosmicdust
2013/10/26镜像同步4 回复
三个文件的代码如下: 文件1:Operation.h #ifndef OPERATION_H_INCLUDED #define OPERATION_H_INCLUDED class Operation { public: Operation(); Operation(double a, double b); virtual double GetResult(); double numberA; double numberB; }; class OperationAdd : public Operation { public: double GetResult(); }; class OperationSub : public Operation { public: double GetResult(); }; class OperationMul : public Operation { public: double GetResult(); }; class OperationDiv : public Operation { public: double GetResult(); }; class OperationFactory { public: static Operation& CreateOperate(char s); }; #endif // OPERATION_H 第二个文件:Operation.cpp #include "Operation.h" Operation::Operation() { numberA = 0; numberB = 0; } Operation::Operation(double a, double b) { numberA = a; numberB = b; } virtual double Operation::GetResult() { double result = 0; return result; } double OperationAdd::GetResult() { double result = numberA + numberB; return result; } double OperationSub::GetResult() { double result = numberA - numberB; return result; } double OperationMul::GetResult() { double result = numberA * numberB; return result; } double OperationDiv::GetResult() { double result = numberA / numberB; return result; } static Operation& OperationFactory::CreateOperate(char s) { switch (s) { case '+': OperationAdd *oper = new OperationAdd(); break; case '-': OperationSub *oper = new OperationSub(); break; case '*': OperationMul *oper = new OperationMul(); break; case '/': OperationDiv *oper = new OperationDiv(); break; } return *oper; } 第三个文件:main.cpp #include <iostream> #include "Operation.h" using namespace std; int main() { Operation &oper = OperationFactory::CreateOperate('+'); oper.numberA = 1.0; oper.numberB = 2.0; double result = oper.GetResult(); cout << result << endl; return 0; } 编译时发生错误截图如下 求解,拜谢!
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
rollse机器人#1 · 2013/10/26
将文件Operation.cpp的内容修改为下面的代码: #include "Operation.h" Operation::Operation() { numberA = 0; numberB = 0; } Operation::Operation(double a, double b) { numberA = a; numberB = b; } double Operation::GetResult() { double result = 0; return result; } double OperationAdd::GetResult() { double result = numberA + numberB; return result; } double OperationSub::GetResult() { double result = numberA - numberB; return result; } double OperationMul::GetResult() { double result = numberA * numberB; return result; } double OperationDiv::GetResult() { double result = numberA / numberB; return result; } Operation& OperationFactory::CreateOperate(char s) { Operation *oper; switch (s) { case '+': oper = new OperationAdd(); break; case '-': oper = new OperationSub(); break; case '*': oper = new OperationMul(); break; case '/': oper = new OperationDiv(); break; } return *oper; } 首先Operation& OperationFactory::CreateOperate(char s)这个是类的静态成员方法,在定义方法实现体的时候,不能在前面加static关键字,static关键字用于限定方法只在该源文件具有可见性,而类就是我们设计好了在其他地方调用的,这就带来了矛盾,所以不允许这样定义。 其次实现体中应该使用运行时多态,像上面代码里面所示。 再次double Operation::GetResult()之前不能加virtual关键字,该关键字只用来声明,定义实现体时不需要。
cosmicdust机器人#2 · 2013/10/26
懂了!谢谢你![ema4] 【 在 rollse 的大作中提到: 】 : 将文件Operation.cpp的内容修改为下面的代码: : #include "Operation.h" : Operation::Operation() : ...................
iFadeToBlack机器人#3 · 2013/10/26
别这么写 Operation& OperationFactory::CreateOperate(char s) 改成 Operation* OperationFactory::CreateOperate(char s) 或者用shared_ptr<Operation*> 别忘了delete CreateOperate返回一个Operation对象,那就叫CreateOperation呗,CreateOperate从英语语法上说也不对啊
cosmicdust机器人#4 · 2013/10/26
谢谢! 【 在 iFadeToBlack 的大作中提到: 】 : 别这么写 : Operation& OperationFactory::CreateOperate(char s) : 改成 : ...................