国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

20170218C++項(xiàng)目班02_01Node實(shí)現(xiàn)

2019-11-08 02:22:10
字體:
供稿:網(wǎng)友

Node實(shí)現(xiàn):

1:在方法后面加上override代表這個(gè)方法是重寫的。2:面向?qū)ο蠛褪褂脤?duì)象:    面向?qū)ο螅簩?duì)象語義,是淺拷貝的實(shí)現(xiàn)方式,實(shí)際只有一個(gè)對(duì)象,不支持拷貝。    使用對(duì)象:值語義,實(shí)現(xiàn)了深拷貝的稱之為值語義,因?yàn)閷?shí)現(xiàn)了多個(gè),拷貝后與原對(duì)象無關(guān)。    注意:兩種語義沒有好壞之分,根據(jù)我們的工程和實(shí)際情況來定是對(duì)象語義和值語義。3:我們每個(gè)Node都是單一的,應(yīng)該是對(duì)象語義,不支持拷貝的。所以我們應(yīng)該把賦值函數(shù)(op=)和拷貝構(gòu)造函數(shù)干掉。4:左右節(jié)點(diǎn)的生命周期應(yīng)該是由上一個(gè)節(jié)點(diǎn)來管理。5:實(shí)現(xiàn)對(duì)象語義一種方式是將類的賦值函數(shù)和拷貝構(gòu)造函數(shù)做成私有的,另一種方式是使用抽象類來做:    當(dāng)哪一個(gè)類需要實(shí)現(xiàn)對(duì)象語義的時(shí)候就可以PRivate繼承于下面的類:
	class NonCopyable//對(duì)象語義是拿來限制的	{	protected:		NonCopyable(){}	private: 		NonCopyable(const NonCopyable&);		const NonCopyable& Operator=(const NonCopyable&) = delete;	};注意:使用public繼承也是可以的,但是這個(gè)類并沒有實(shí)現(xiàn)他,相當(dāng)于是一個(gè)接口,對(duì)這種接口類的集成,我們一般使用private繼承。原理來自于    以前學(xué)的可以知道一個(gè)類在自己沒實(shí)現(xiàn)方法的時(shí)候默認(rèn)會(huì)生出八個(gè)默認(rèn)的函數(shù)(構(gòu)造、析構(gòu)、賦值、拷貝構(gòu)造、op*、op&、const op*、const op&),在對(duì)象生成的時(shí)候也會(huì)現(xiàn)調(diào)用基類的對(duì)應(yīng)方法,這里調(diào)用不到,所以防止了被拷貝構(gòu)造和賦值。6:對(duì)象語義還可以通過智能指針的方式來做,例如再使用STL的時(shí)候,STL必須支持拷貝,釋放時(shí)機(jī)變得不同,通過計(jì)數(shù)的方式來決定。

代碼:

Node.h------------------------------------------------------------------------------------------------
#ifndef _NODE_H_#define _NODE_H_#include <cfloat>#include <iostream>namespace PoEdu{	class NonCopyable//對(duì)象語義是拿來限制的不產(chǎn)生拷貝。對(duì)象語義還可以用智能指針的方式來實(shí)現(xiàn)。STL的時(shí)候	{	protected:		NonCopyable(){}	private: 		NonCopyable(const NonCopyable&){ std::cout << "NonCopyable(NonCopyable&)" << std::endl; }		const NonCopyable& operator=(const NonCopyable&) = delete;//等于刪除,不寫=delete也可以,方便程序閱讀。	};	class Node:public NonCopyable//對(duì)象語義的實(shí)現(xiàn)。	{	public:		Node(){}		virtual ~Node(){}		virtual double Calc() const = 0;	};	class NumberNode :public Node	{	public:		NumberNode(const double number) :num_(number){}		double Calc() const override//override告訴程序員這個(gè)方法是重寫的		{			return num_;		}	private:		double num_;	};	class BinaryNode :public Node	{	public:		BinaryNode(Node* left, Node* right) :left_(left), right_(right)		{		}		~BinaryNode()		{			delete left_;			delete right_;			std::cout << "delete_lr" << std::endl;		}	protected:		Node* left_;//父類指針可以指向子類對(duì)象。		Node* right_;	};	class AddNode :public BinaryNode	{	public:		AddNode(Node* left, Node* right) :BinaryNode(left, right)		{		}		double Calc() const override		{			return left_->Calc() + right_->Calc();		}	};	class SubNode :public BinaryNode	{	public:		SubNode(Node* left, Node*right) :BinaryNode(left, right)		{		}		double Calc() const override		{			return left_->Calc() - right_->Calc();		}	};	class MulitplyNode :public BinaryNode	{	public:		MulitplyNode(Node* left, Node*right) :BinaryNode(left, right)		{		}		double Calc() const override		{			return left_->Calc() * right_->Calc();		}	};	class DivideNode :public BinaryNode	{	public:		DivideNode(Node* left, Node*right) :BinaryNode(left, right)		{		}		double Calc() const override		{			double divisor = right_->Calc();			if (divisor > DBL_EPSILON || divisor < -DBL_EPSILON)			{				divisor = left_->Calc() / right_->Calc();			}			return divisor;		}	};	class UnaryNode :public Node	{	public:		UnaryNode(Node* child) :child_(child){}		~UnaryNode()		{			delete child_;			std::cout << "delete_c" << std::endl;		}	protected:		Node* child_;	};	class MinusNode :UnaryNode	{		MinusNode(Node *child) :UnaryNode(child)		{		}		double Calc() const override		{			return -child_->Calc();		}	};}#endifmain.c-------------------------------------------------------------------------------------------------
#include <iostream>#include "Node.h"int main(){	using namespace PoEdu;	Node *p = new NumberNode(10);	Node *p1 = new NumberNode(20);	Node *p2 = new NumberNode(30);	Node *calc = new AddNode(p, new MulitplyNode(p1, p2));	std::cout << calc->Calc() << std::endl;	return 0;}
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 象山县| 威远县| 定南县| 凌海市| 三河市| 临夏县| 疏附县| 达孜县| 离岛区| 孟州市| 邮箱| 黄平县| 亳州市| 花莲县| 蕲春县| 运城市| 万山特区| 淮安市| 湘乡市| 桃园县| 南京市| 方城县| 娄烦县| 宁德市| 天台县| 泸溪县| 神农架林区| 遵义县| 汝城县| 新乡县| 桃江县| 额尔古纳市| 葫芦岛市| 响水县| 顺义区| 宿迁市| 渑池县| 秭归县| 岳阳县| 陵川县| 仙桃市|