计算器的github下载地址:https://github.com/ljian1992/calculator
我们的最终目的是计算出表达式中的值,因此就需要定义一个抽象类用于计算表达式的值,该抽象类定义为:Node
下面所有的类图不使用UML建模语言画的,是通过visual studio自动生成的类关系图(自己用UML建模画的不小心被我删掉了)
Node的类图
它继承了个Noncpyable类,由于我们是要做面向对象的表达式计算器,所以呢,通过一个小小的手段,把拷贝给禁止掉。这个小小的手段就是让一个类继承一个把拷贝构造函数和赋值操作符重载设置为private权限的函数,把无参构造函数和析构函数设置为权限protected。
例如:
class Noncpyable { protected: Noncpyable() {} ~Noncpyable() {} private: //子类继承后,并没有权限访问这两个函数,而子类的拷贝又需要调用到这两个函数,故把拷贝给禁止了。 Noncpyable(const Noncpyable &); const Noncpyable& operator= (const Noncpyable &) const; };
Noncpyable的类图
现在对运算符进行抽象,运算符可以分为一元运算符,二元运算符,
一元运算符:函数,取反(-)
二元运算符:加,减,乘,除,赋值运算
这样的话,我们应该把一元运算符和二元运算符定义成抽象类,而具体的运算符设置为具体类继承它们。当然它们都要继承Node。
一元运算符
二元运算符
这是表达式的BNF表示
Expr ::= Term{(‘+‘ | ‘-‘) Term }
Expr ::= Term = Expr
Term ::= Factor {(‘*‘ | ‘/‘) Factor }
factor ::=
1.number
2.identifier
2.1.function
2.2.variable
3.‘-‘factor
4.‘(‘expression‘)‘
现在我们需要支持蓝色字体中的特性,先来 Expr ::= Term{(‘+‘ | ‘-‘) Term } 、Term ::= Factor {(‘*‘ | ‘/‘) Factor }这两个吧
它们都要一个共同的特性:包含的为可重复0至无数次的项。因此设置一个抽象类MultipleNode来表示这种特性
对 Expr ::= Term{(‘+‘ | ‘-‘) Term }设置一个SumNode的类,Term ::= Factor {(‘*‘ | ‘/‘) Factor }设置一个ProductNode类
支持number,把设置一个NumberNode保存一个数字
支持variable,设置一个VariableNode保存变量信息
现在把所有的关于计算的类都设计完了,下面来个“完整的”的类图