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

《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的贝尔实验 室开发的一种语言。

    2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法

    2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-C++后端-学习笔记-操作系统、计算机网络、C++语言+算法 2024届求职-...

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

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

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

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

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

    C++程序设计教程--面向对象分册(郑秋生)完整答案 本资源为C++程序设计教程的面向对象分册,涵盖了面向对象编程的基础知识和实践题目。下面是对资源中提及的知识点的总结和解释: 一、类和对象 * 类(class):...

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

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

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

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

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

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

    C++设计模式--基于Qt4开源跨平台开发框架

    在C++中,设计模式的应用通常涉及到面向对象编程的特性,如继承、封装和多态。Qt4框架则为这些模式提供了实现基础。例如,Qt4的信号与槽机制(Signals & Slots)可以很好地支持观察者模式,使得对象间能动态地建立和...

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

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

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

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

    c++面向对象程序设计语言重点难点复习题及答案-整理.pdf

    面向对象程序设计语言C++重点难点复习题及答案总结 面向对象程序设计语言C++是一种功能强大且广泛应用的程序设计语言,作为一名程序员,掌握C++语言的重点难点是非常重要的。本文将对C++面向对象程序设计语言的重点...

    2024届求职C++后端-学习笔记-操作系统、计算机网络、C++语言+算法面试笔试资源.zip

    【资源说明】2024届求职C++后端-学习笔记-操作系统、计算机网络、C++语言+算法面试笔试资源.zip2024届求职C++后端-学习笔记-操作系统、计算机网络、C++语言+算法面试笔试资源.zip2024届求职C++后端-学习笔记-操作...

    c++面向对象设计笔记

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

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

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

Global site tag (gtag.js) - Google Analytics