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


    计算器的github下载地址:https://github.com/ljian1992/calculator

    我们的最终目的是计算出表达式中的值,因此就需要定义一个抽象类用于计算表达式的值,该抽象类定义为:Node

    下面所有的类图不使用UML建模语言画的,是通过visual studio自动生成的类关系图(自己用UML建模画的不小心被我删掉了)

    Node的类图

    clip_image001

    它继承了个Noncpyable类,由于我们是要做面向对象的表达式计算器,所以呢,通过一个小小的手段,把拷贝给禁止掉。这个小小的手段就是让一个类继承一个把拷贝构造函数和赋值操作符重载设置为private权限的函数,把无参构造函数和析构函数设置为权限protected。

    例如:

    class Noncpyable
    
    {
    
    protected:
    
    Noncpyable() {}
    
    ~Noncpyable() {}
    
    private:
    
    //子类继承后,并没有权限访问这两个函数,而子类的拷贝又需要调用到这两个函数,故把拷贝给禁止了。
    
    Noncpyable(const Noncpyable &);
    
    const Noncpyable& operator= (const Noncpyable &) const;
    
    };

    Noncpyable的类图

    clip_image002

    现在对运算符进行抽象,运算符可以分为一元运算符,二元运算符,

    一元运算符:函数,取反(-)

    二元运算符:加,减,乘,除,赋值运算

    这样的话,我们应该把一元运算符和二元运算符定义成抽象类,而具体的运算符设置为具体类继承它们。当然它们都要继承Node。

    一元运算符

    clip_image003

    二元运算符

    clip_image004

    这是表达式的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类

    clip_image005

    支持number,把设置一个NumberNode保存一个数字

    clip_image006

    支持variable,设置一个VariableNode保存变量信息

    clip_image007

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

    clip_image008

  • 相关阅读:
    我的浏览器和常用扩展
    Win10安装.Net Framework4.7及更高版本
    压缩和解压工具bandizip
    Oracle trunc()函数的用法
    Oracle 中 decode 函数用法
    Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法
    String literal is not properly closed by a double-quote eclipse
    linux 启动 Oracle 实例
    查询当前Oracle数据库的实例
    sqlplus 执行 sql 文件
  • 原文地址:https://www.cnblogs.com/Ljian1992/p/4287144.html
Copyright © 2020-2023  润新知