返回信息流三个文件的代码如下:
文件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;
}
编译时发生错误截图如下
求解,拜谢!
这是一条镜像帖。来源:北邮人论坛 / cpp / #74806同步于 2013/10/26
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
请教一个C++实现“工厂模式”时遇到的问题
cosmicdust
2013/10/26镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
将文件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关键字,该关键字只用来声明,定义实现体时不需要。
懂了!谢谢你![ema4]
【 在 rollse 的大作中提到: 】
: 将文件Operation.cpp的内容修改为下面的代码:
: #include "Operation.h"
: Operation::Operation()
: ...................
别这么写
Operation& OperationFactory::CreateOperate(char s)
改成
Operation* OperationFactory::CreateOperate(char s)
或者用shared_ptr<Operation*>
别忘了delete
CreateOperate返回一个Operation对象,那就叫CreateOperation呗,CreateOperate从英语语法上说也不对啊
谢谢!
【 在 iFadeToBlack 的大作中提到: 】
: 别这么写
: Operation& OperationFactory::CreateOperate(char s)
: 改成
: ...................