class NonCopyable//对象语义是拿来限制的 { protected: NonCopyable(){} private: NonCopyable(const NonCopyable&); const NonCopyable& Operator=(const NonCopyable&) = delete; };注意:使用public继承也是可以的,但是这个类并没有实现他,相当于是一个接口,对这种接口类的集成,我们一般使用private继承。原理来自于 以前学的可以知道一个类在自己没实现方法的时候默认会生出八个默认的函数(构造、析构、赋值、拷贝构造、op*、op&、const op*、const op&),在对象生成的时候也会现调用基类的对应方法,这里调用不到,所以防止了被拷贝构造和赋值。6:对象语义还可以通过智能指针的方式来做,例如再使用STL的时候,STL必须支持拷贝,释放时机变得不同,通过计数的方式来决定。代码:
Node.h------------------------------------------------------------------------------------------------#ifndef _NODE_H_#define _NODE_H_#include <cfloat>#include <iostream>namespace PoEdu{ class NonCopyable//对象语义是拿来限制的不产生拷贝。对象语义还可以用智能指针的方式来实现。STL的时候 { protected: NonCopyable(){} private: NonCopyable(const NonCopyable&){ std::cout << "NonCopyable(NonCopyable&)" << std::endl; } const NonCopyable& operator=(const NonCopyable&) = delete;//等于删除,不写=delete也可以,方便程序阅读。 }; class Node:public NonCopyable//对象语义的实现。 { 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告诉程序员这个方法是重写的 { 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_;//父类指针可以指向子类对象。 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;}
新闻热点
疑难解答
图片精选