我有以下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
并为switch
的四个case
中的每一个编写一个子类?
品味问题。您认为"加号节点"与"减号节点"是不同类型的对象吗?需要考虑的一件事是,您不能修改对象的类,因此通过使它们成为单独的类,您将失去将"加号节点"更改为不同类型的节点的能力。
在这种情况下,添加四个类来摆脱单个 switch 语句似乎使事情过于复杂。
这里有一种方法可以做到这一点:
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...