文档章节

一个面向对象程序范例

 混世太保
发布于 2017/07/30 17:06
字数 589
阅读 4
收藏 0

1.最近几天在看c++ 沉思录。里面举的例子确实让我茅塞顿开,醍醐灌顶哈。

2.我把代码贴上去吧。根据原书的代码敲的。

这一章的内容要解决的是如何表示一个表达式树。

作者将所有类型的表达式都隔离开了,就用一个类来提供所有的接口,管理内存。让用户避免记住麻烦的用法和内存管理。

相当巧妙

//Expr_node.h
#include <iostream>
using namespace std;

class Expr;
class Expr_node
{
	friend ostream& operator<<(ostream& o, const Expr& t);
	friend ostream& operator<<(ostream& o, const Expr_node& e)
	{
		e.print(o);
		return o;
	}

	friend class Expr;

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

class Expr
{
	friend ostream& operator<<(ostream&, const Expr&);
	friend class Expr_node;
	Expr_node* p;
public:
	Expr(int); // create a int_node;
	Expr(const string &, Expr);
	Expr(const string &, Expr, Expr);
	Expr(const string& , Expr, Expr, Expr);
	Expr(const Expr& t) { p = t.p; ++ p->use;};
	Expr& operator=(const Expr&);
	~Expr(){ if( -- p->use == 0) delete p;}

	int eval() const {return p->eval();}
};

class Int_node: public Expr_node 
{
	friend class Expr;
	int n;

	Int_node(int k):n(k) {}
	void print(ostream& o) const { o << n;}
	virtual int eval() const { return n;}
};
//unary node
class Unary_node : public Expr_node
{
	friend class Expr;
	string op;
	Expr opnd;
	Unary_node(const string& a, Expr b):op(a), opnd(b) {}
	void print(ostream& o) const
	{ o <<"( " << op << opnd << ") ";}
	int eval() const;
};

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 <<") ";
	}

	int eval() const;
};

class Ternary_node : public Expr_node
{
	friend class Expr;
	string op;
	Expr left;
	Expr middle;
	Expr right;

	Ternary_node(const string& a, Expr b, Expr c, Expr d):
		op(a), left(b), middle(c), right(d) { }

	void print(ostream& o) const;
	int eval( ) const;
};
//Expr_node.cpp
#include "Expr_node.h"

Expr::Expr(int n)
{
	p = new Int_node(n);
}

Expr::Expr(const string& op, Expr t)
{
	p = new Unary_node(op, t);
}

Expr::Expr(const string& op, Expr left, Expr right)
{
	p = new Binary_node(op, left, right);
}

Expr::Expr(const string& op, Expr left, Expr middle, Expr right)
{
	p = new Ternary_node(op, left, middle, right);
}

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

ostream& operator<<(ostream& o, const Expr& t)
{
	t.p->print(o);
	return o;
}

int Unary_node::eval() const 
{
	if (op == "-")
		return -opnd.eval();
	throw "error, bad op " + op + " int UnaryNode";
}

int Binary_node::eval() const
{
	int op1 = left.eval();
	int op2 = right.eval();

	if (op == "-")  return op1 - op2;
	if (op == "+")  return op1 + op2;
	if (op == "*")  return op1 * op2;
	if (op == "/" && op2 != 0)  return op1 / op2;

	throw "error, bad op " + op + " in BinaryNode";
}

void Ternary_node::print(ostream& o) const
{
	o<<"( "<<left<<" ? "<<middle<<" :  "<<right<<") ";
}
int Ternary_node::eval() const
{
	if (left.eval())
		return middle.eval();
	else
		return right.eval();
}
//main.cpp
#include <iostream>

#include "Expr_node.h"

using namespace std;
int main(int argc, char const *argv[])
{
	Expr t = Expr("*", Expr("-", 5), Expr("+", 3,4));
	cout<<t<<" = "<< t.eval() <<endl;
	t = Expr("*", t, t);
	cout<<t<<" = "<< t.eval() <<endl;
	return 0;
}

 

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 25
码字总数 11812
作品 0
厦门
私信 提问
技术开发手册之Openbiz 概述

什么是Openbiz Openbiz是一个应用程序框架,其提供了面向对象的基于元数据驱动的平台,使应用程序开发人员可以通过编写尽可能最少的程序代码就可以建立出Web应用程序。Openbiz框架从2003年开...

吉贤
2012/04/12
0
0
在配置文件(.settings、.config)中存储自定义对象

引言 我前面曾写过一篇《使用配置文件(.settings、.config)存储应用程序配置》,我在其中指出“settings无法实现对一些复杂类型及自定义类型的支持”。 而今天我发现其实它是支持自定义类型...

老朱教授
2017/11/21
0
0
Android开发-面向对象的数据库Db4o

领先的开源面向对象数据库提供厂商db4objects宣布db4o已可以顺利运行于Android平台。先前的InfoQ新闻“Db4Objects发布Db4o 7.0,支持透明激活”中曾经报道db4objects公司和爱好者积极推进db4...

JavaGG
2010/03/24
949
0
JAVASCRPIT的OpenCharts

一、Introduce/简介 OpenCharts是基于HTML Canvas技术的采用面向对象的Web图表,通过OpenCharts,你可以方便的制作一系列漂亮的Web图表。现在我们支持8种类型的图表表达方式,你可以通过帮助...

0了凡0
2016/09/10
18
0
Openbiz Cubi 企业级应用程序开发(一)

第一章 Openbiz Cubi 介绍 什么是 Openbiz 框架 Openbiz是一个应用程序框架。它提供了一个面向对象的基于元数据驱动的平台,使应用程序开发人员可以通过编写尽可能少的程序代码就可以建立出W...

吉贤
2012/06/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《货币商人》读后感作文选登3800字

《货币商人》读后感作文选登3800字: 领导之法、管理之术的大智慧与小技巧(宝安支行纪委书记葛希) 非常感谢夏书记向我们推荐了这本《货币商人》。这本书我读第一遍时惊现它像一个宝藏,蕴藏...

原创小博客
21分钟前
0
0
面试之ssm粗略简答

说实在的,spring源码对我来说可能就是报错的时候会一个个点进去找错误源头,其他都是为了让自己学习大神们优秀的编程思想和理念(顺便面试的时候吹吹牛皮~) 这次zhjj就直接抛了一个范围很...

无极之岚
22分钟前
1
0
史上最强Dubbo面试25题含答案详解:核心组件+架构设计+服务治理等

1.Dubbo是什么? Dubbo 是一个分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成。 RPC 指的是远程调用协议,也就是说两...

mikechen优知
46分钟前
0
0
如何正确的选择云数据库?

本文由云+社区发表 作者:数据库 江湖传说在选择和使用云数据库过程中 10个人有9个会遇到以下问题: 数据库正常使用过程中莫名卡顿 经常遭遇主从延迟和主从不一致 不知如何实现无损跨云跨数据...

腾讯云加社区
46分钟前
0
0
虚拟机下centos7.x简易命令大全与试玩体验

OS: liunx version: centos7.x date: 2019-01-18 1. cd / : 进入服务器根目录 2. cd .. : 进入当前目录的上一级 3. ls : 显示当前目录下的所有文件夹或文件(list的缩写) 4. ip addr : 展示服...

皇冠小丑
57分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部