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;}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注