绕过具有继承的switch语句

时间:2015-04-21 16:20:26

标签: c++ inheritance polymorphism

我有以下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中的每一个写一个子类?

2 个答案:

答案 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...