博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 句柄类的原理以及设计
阅读量:6256 次
发布时间:2019-06-22

本文共 2414 字,大约阅读时间需要 8 分钟。

句柄类存在的意义是为了弥补将派生类对象赋给基类对象时发生的切片效应。比如以下的程序:
multimap basket;Base base;Derived derive;basket.insert(base);	//ok,add copy of base;basket.insert(derive);	//ok,but derive sliced down to its base part.
也就是说在把派生类的对象赋值给基类的时候,会发生切片效益,派生类的非基类部分会被切掉,那么就失去了本身的意义。为了解决问题我们能够
使用基于基类的指针或者引用,可是设计到指针问题的话就涉及到资源不使用后的释放问题。这就引出了句柄类,它类似智能指针,能够在我们复制资源
的时候不用去操心内存泄露的问题。整个程序的设计例如以下所看到的:
//Base.h#pragma onceclass Base{public:	Base(void);	virtual ~Base(void);	virtual Base* clone() const;	virtual void fine() const;private:	int mb;};
//Base.cpp#include "Base.h"#include 
using namespace std;Base::Base(void):mb(12){}Base::~Base(void){}Base* Base::clone() const{ return new Base(*this);}void Base::fine() const{ cout<<"Base fine function"<
//Derive.h#pragma once#include "base.h"class Derive :	public Base{public:	Derive(void);	virtual ~Derive(void);	virtual Derive* clone() const;	virtual void fine() const;private:	int md;};
//Derive.cpp#include "Derive.h"#include 
using namespace std;Derive::Derive(void):Base(),md(13){}Derive::~Derive(void){}Derive* Derive::clone() const{ return new Derive(*this);}void Derive::fine() const{ cout<<"Derive fine function"<
//Handles.h #pragma once#include "Base.h"#include 
class Handles{public: Handles(void); Handles(const Base&); Handles(const Handles& h); ~Handles(void); const Base* operator->()const; const Base& operator*()const; Handles& operator=(const Handles&); private: Base* p; std::size_t* use; void dec_use() { if(--*use == 0) { delete p; delete use; std::cout<<"delete resource"<
//Handle.cpp #include "Handles.h"Handles::Handles(void):p(NULL),use(new size_t(1)){}Handles::Handles(const Handles& h):p(h.p),use(h.use){	++*use;}Handles::Handles(const Base& item):p(item.clone()),use(new std::size_t(1)){}const Base& Handles::operator*()const{		if(p) 			return *p;		else			throw std::logic_error("unbounded Handles");}const Base* Handles::operator->()const{		if(p) 			return p;		else			throw std::logic_error("unbounded Handles");}Handles& Handles::operator=(const Handles& h){	++*h.use;	dec_use();	p = h.p;	use = h.use;	return *this;}Handles::~Handles(){	dec_use();}
//main.cpp#include 
#include "Handles.h"#include "Derive.h"#include
using namespace std;void main(){ vector
mb; Base b; Derive d; mb.push_back(Handles(b)); mb.push_back(Handles(d)); mb[0]->fine(); mb[1]->fine(); system("pause");}

转载地址:http://xwnsa.baihongyu.com/

你可能感兴趣的文章
Oracle二三事之 EBS升级
查看>>
PC端体验效果最佳epub阅读器——iRead爱读书
查看>>
DataGridView打印类
查看>>
【java】实体类中 Set<对象> 按照对象的某个字段对set排序
查看>>
java基础之:匿名内部类应用例子一
查看>>
如何保证黑盒测试的覆盖率(转)
查看>>
spring jpa 实体互相引用返回restful数据循环引用报错的问题
查看>>
Android Butterknife 8.4.0 使用方法总结
查看>>
横向滑动的HorizontalListView滑动指定位置的解决方法
查看>>
c语言语系的命名风格和java系命名风格
查看>>
2013百度校招笔试真题以及解析(内存管理及其优缺点总结)
查看>>
Python Skelve 库
查看>>
自制DbHelper实现自动化数据库交互
查看>>
195.3. fonts 字体
查看>>
2014年度总结2015展望
查看>>
微信小程序之页面路由
查看>>
SAP Batch Management - Price Determination for Batches
查看>>
队列、资源与锁
查看>>
ANN中Precision-Recall权衡
查看>>
MySQL之Double Write Buffer分析
查看>>