我有以下C ++代码,可以用来计算算术表达式。
struct Node
{
char _operator;
int _value;
Node* _previous;
Node* _next;
double calculate()
{
switch(_operator)
{
case '#': return _value;
case '*': return _previous->calculate() * _next->calculate();
case '+': return _previous->calculate() + _next->calculate();
case '-': return _previous->calculate() - _next->calculate();
}
return -1;
}
}
我是C ++的新手,我理解一般来说,对于OOP来说,使用继承比使用条件结构更好,特别是当它们被深度嵌套时。
我想知道如何使用继承转换交换机,虽然这对于这个例子是不可行的(是吗?)
我是否声明calculate
函数abstract
并为case
的四个switch
中的每一个写一个子类?
答案 0 :(得分:4)
品味问题。你认为一个"加节点"是一种不同于"减去节点的对象"?要考虑的一件事是你不能修改一个对象的类,所以通过使它们成为单独的类,你就失去了改变一个" plus节点的能力。到另一种节点。
在这种情况下,添加四个类来摆脱单个switch语句似乎过于复杂。
答案 1 :(得分:2)
这是一种方法:
class Expression {
virtual double calculate() = 0;
}
class Literal : Expression {
double _value;
double calculate() {
return _value;
}
}
class Operation {
protected:
Expression* _previous;
Expression* _next;
}
class Addition : Operation {
double calculate() {
return _previous->calculate() + _next->calculate();
}
}
class Subtraction : Operation {
double calculate() {
return _previous->calculate() - _next->calculate();
}
}
...and so on...