`
mooncui
  • 浏览: 72510 次
社区版块
存档分类
最新评论

《C++沉思录》笔记--一个面向对象设计的例子

    博客分类:
  • C++
阅读更多

一个问题,如下图,没有画出箭头
    *
 -       +
5     3  4

Class Expr_node{
 friend ostream operate<<(ostream&,const Expr_node&); //<<符号是不能用动态绑定的,所以用print函数采用动态绑定,用<<符号调用print函数
                  //而且由于不准备提供print函数给用户使用,则把print定为protected,把<<符号定为友元。

protected:
 virtual void print(ostream&) const = 0;
 virtual ~Expr_node(){}; 
}

从Expr_node中派生出Int_node,Unary_node,Binary_node

class Int_node: public Expr_node{
 friend class Expr;
 int n;
 Int_node(int k):n(k){}
 Void print(ostream& o) const {o<<n;}
}

class Unary_node: public Expr_node{
 friend class Expr;
 String op;
 Expr_node* opnd;
 Unary_node(const String& a,Expr_node* b):op(a),opnd(b){}
 Void print(ostream& o) const {o<<"(" << op << *opnd  << ")";}
}

class Binary_node: public Expr_node{
 friend class Expr;
 String op;
 Expr_node* left;
 Expr_node* right;
 Binary_node(const String& a,Expr_node* b,Expr_node* c):op(a),left(b),right(c){}
 Void print(ostream& o) const {o<<"("<<*left << op << *right  << ")";}
}

这样用户必须自己去维护那些指针分配的内存。这里没有对图中的箭头进行建模,而是把箭头作为一个简单的指针,然后还强迫
用户亲自操作这些指针。
所以我们另外定义个Expr这个句柄类来表示箭头。并用这个结构来代表一个树或子树,隐藏Expr_node节点。

class Expr{
 friend ostream operate<<(ostream&,const Expr&);
 Expr_node* p;
public:
 Expr(int);  //创建一个Int_node
 Expr(const String&,Expr);  //创建一个Unary_node
 Expr(const String&,Expr,Expr); //创建一个Binary_node
 Expr(const Expr&);
 Expr& operate=(const Expr&);
 ~Expr(){delete p;}
}

考虑复制构造函数和赋值操作符,中要copy Expr_node指针,这里也涉及内存的问题,但最好还是不要真正实现复制操作了,仅copy指针
然后在Expr_node中增加一个计数:int use,初始化为1

Expr(const Expr& t){
 p = t.p;
 ++p->use;
}

Expr& operate=(const Expr& rhs){
 rhs.p->use++;
 if(--p->use == 0)
  delete p;
 p = rhs.p;
 return *this;
}

ostream operate<<(ostream& o,const Expr& t){
 t.p->print(o);
 return o;
}
然后修改各个派生自Expr_node的类,令其操作为私有的,将Expr类声明为友元,存储Expr,而不是存储指向Expr_node的指针。例如Binary_node
class Binary_node: public Expr_node{
 friend class Expr;
 String op;
 Expr left;
 Expr right;
 Binary_node(const String& a,Expr b,Expr c):op(a),left(b),right(c){}
 Void print(ostream& o) const {o<<"("<<left << op << right  << ")";}
}

现在这种设计就非常好了,如果再增加一个功能,如计算运算结果,则只要在每个节点类中增加一个eval函数就可以了。
如果要再增加一个运算符,如类似?:(if then else),那么只要增加一个派生Expr_node的子类Ternary_node类就好了。

分享到:
评论

相关推荐

    《C++沉思录》--十年编程生涯的真知灼见

    《C++沉思录》--十年编程生涯的真知灼见

    c++笔记资源---面向对象程序设计思

    随着面向对象程序设计思 想的日益普及,很多支持面向 对象程序设计方法语言也相继 出现了,C++就是这样一种语 言。C++是Bjarne Stroustrup 于1980年在AT&T的贝尔实验 室开发的一种语言。

    面向对象程序设计C++听课笔记

    以上就是“面向对象程序设计C++听课笔记”的主要内容,涵盖了C++中的核心面向对象概念及其在实践中的应用,对学习和理解C++编程有着重要的指导意义。通过深入学习和实践,可以提升软件开发的能力,更好地应对复杂的...

    数据结构与算法--面向对象的C++设计

    本书标题为《数据结构与算法——面向对象的C++设计》,其内容主要围绕数据结构和算法在C++中的面向对象设计模式展开。本书不仅介绍了数据结构与算法的基本概念,还着重强调了面向对象编程范式(Object-Oriented ...

    数据结构与算法-面向对象的C++设计模式

    - 本节的主题涉及面向对象设计模式在C++中的应用。 - 对象分级的概念是C++面向对象编程的基础。 - 读者需要掌握C++的特定特性以便更好地理解和应用后续内容。 **第2章 算法分析** - 介绍了计算机模型的细化,包括...

    c++马石安-面向对象程序设计-习题答案.zip

    《C++面向对象程序设计-习题答案》是由著名计算机教育专家马石安教授编写的,专注于讲解C++编程中的面向对象技术。这份资料包含了大量习题及其解答,旨在帮助学习者深入理解和掌握面向对象编程的核心概念。 面向...

    C++学习笔记- 面向对象 .md

    内容是C++面对对象的,目录大致来源于菜鸟文档的C++面向对象,笔记是参考各种文章以及菜鸟文档改编的,内容包含C++类和对象(类定义和对象定义,类成员函数,类访问修饰符,友元函数,内联函数,this指针,静态成员...

    2022年陈天华-面向对象程序设计C++第三版-ppt-第一章完整.ppt

    "2022年陈天华-面向对象程序设计C++第三版-ppt-第一章完整.ppt" 本资源是《面向对象程序设计》的第一章ppt课件,主要介绍面向对象程序设计的基本概念、特点、语言和软件开发。通过本章的学习,学生将了解面向对象...

    C++面向对象程序设计 经典例题 附练习题

    本资料包“C++面向对象程序设计 经典例题 附练习题”显然是为了帮助学生深入理解C++的面向对象特性,并通过实例和练习来巩固学习成果。 在C++中,面向对象的主要概念包括: 1. **类**:类是创建对象的模板或蓝图,...

    《C++沉思录》第八章 “一个面向对象程序的范例”

    《C++沉思录》是C++编程领域中一本经典的著作,它深入探讨了C++语言的核心概念和设计哲学。第八章“一个面向对象程序的范例”是书中的一个重要章节,旨在通过一个完整的示例来阐述面向对象编程(OOP)在实际应用中的...

    面向对象程序设计—C++语言描述PDF

    《面向对象程序设计:C++语言描述(原书第2版)》内容丰富,结构合理,写作风格严谨,深刻地论述了c++语言的面向对象编程的各种技术,主要内容包括:面向对象编程方法、c++语言的各种特性、stl、c++输入/输出流、mfc等。...

    面向对象程序设计c++课后答案

    ### 面向对象程序设计C++课后答案概述 #### 1. C++的发展历程与特性 - **发展历程**:C++是一种由Bjarne Stroustrup在1979年开始设计并实现的编程语言。它基于C语言进行扩展,旨在提供更强大的抽象机制和类型安全性...

    C++程序设计教程--面向对象分册(郑秋生)完整答案

    - **继承**:继承是面向对象编程的一个关键特性,允许一个类(子类)继承另一个类(父类)的属性和行为。 - **多态性**:多态性是指不同类的对象对同一消息作出响应的能力。C++中的多态性可以通过虚函数实现。 ####...

    C++面向对象程序设计-电子教案

    《C++面向对象程序设计-电子教案》是一个深入学习C++编程的重要资源,它涵盖了C++语言的核心概念、面向对象编程的基本原则以及实际应用。在本文中,我们将详细探讨C++面向对象编程的关键知识点,包括类与对象、封装...

    c++面向对象设计笔记

    C++面向对象设计笔记 本笔记涵盖了C++面向对象设计的基本概念和技术,包括面向对象程序设计的基本原则、类和对象、继承和多态、运算符重载、C++语言的基本语法元素等。 1.1 主要内容 本节介绍了C++语言的基本概念...

    面向对象程序设计(C++语言描述)教程

    面向对象程序设计(C++语言描述)教程是深入学习C++编程的重要资源,它涵盖了从基础概念到高级特性的全面内容。本教程旨在帮助开发者理解并掌握C++中的面向对象编程理念,通过实例和讲解来阐述如何利用C++实现面向...

    C++语言程序设计-郑莉-课后习题答案.pdf

    《C++语言程序设计》是郑莉教授的教材,该书涵盖了C++语言的基础和高级概念,特别是面向对象编程的原理。课后习题解答旨在帮助学生深入理解课程内容。 1. 计算机程序设计语言的发展历程:从机器语言到汇编语言,再...

Global site tag (gtag.js) - Google Analytics