首页 > 其他 > 详细

表达式计算器类的设计1(表达式计算器4)

时间:2015-02-12 00:35:07      阅读:294      评论:0      收藏:0      [点我收藏+]

计算器的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保存变量信息

技术分享

现在把所有的关于计算的类都设计完了,下面来个“完整的”的类图

技术分享

表达式计算器类的设计1(表达式计算器4)

原文:http://www.cnblogs.com/Ljian1992/p/4287144.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!