`
fuerbosi
  • 浏览: 464049 次
文章分类
社区版块
存档分类
最新评论

暑假c++复习17之句柄类

 
阅读更多

句柄类存储和管理基类指针。指针所指的对象的类型可以变化,即可以指向基类对戏那个又可以指向派生类类型对象。用户通过句柄类访问继承层次的操纵。因为句柄类使用指针执行操作,虚成员的行为将在运行时根据句柄实际绑定的对象的类型而变化。因此,句柄的用户可以获得动态行为但无需操心指针的管理。

包装了继承层次的句柄有两个重要的设计考虑因素

1,像对任何保存指针的类一样。必须确定对复制控制做些什么。包装了继承层次的句柄通常表现的像一个只能指针或像一个值。

2,句柄类决定句柄接口屏蔽还是不屏蔽继承层次,如果不屏蔽继承层次,用户必须了解和使用基本层次中的对象。

我们将定义名为Sale_item的指针型句柄类,表示Item_base层次,Sales_item的用户将像使用指针一样使用它:将用户Sals_item绑定到Item_base类型的对象并使用*和—>操作符执行Item_base的操作。

例如:Sale_item item(Bulk_item("0-102-34529",35,4,43));

item->net_price();//item像是指针一样。

用户可以不必管理句柄指向的对象,Sales_item类将完成这部分工作。当用户通过Sales_item类对像那个调用函数式,将获得多态行为。

Sales_item类将有两个数据成员,都是指针,一个指针将指向Item_base对戏那个,而另一个将指向使用计数,Item_base指针可以指向Item_base 也可以指向Item_base 派生类类型的对象,通过指向使用计数,多个Sale_item对象可以共享同一个计数器。

class Sales_item
{
public:
	Sales_item():p(0),use(new size_t(1)){}
	Sales_item(const Item_base&);
	Sales_item(const Sales_item &i):p(i.p),use(i.use)
	{
	++*use;	
	}
	~Sales_item(){dec_use();};
	Sales_item& operator=(const Sales_item&);
	const Item_base *operator->()const{if(p) return p;}
	const Item_base&  operator*()const{if(p) return *p;}
private:
	Item_base *p;
	size_t *use;
	void dec_use()
	{if(--*use==0){delete p;delete use;}}

};

Sales_item& Sales_item::operator=(const Sales_item& i)
{
    ++*i.use;
	dec_use();
	p=i.p;
	use=i.use;
	return *this;


}

要实现Item_base对象的构造函数,必须首先解决一个问题:我们不知道给予构造函数的对象的实际类型,我们知道他是一个Item_base对象或者是它的派生类的对象,句柄类经常需要在不知道对象的确切类型是分配一直对象的新副本。解决这个问题的通用方法是定义虚操作进行赋值,我们称将该操作clone

class Item_base
{
public:
	virtual Item_base* clone()const
	{
	return new Item_base(*this);
	}
};

class Bulk_item:public Item_base
{

public:
	Bulk_item* clont()const
	{
	return new Bulk_item(*this);
	}

};

Sales_item::Sales_item(const Item_base &item):p(item.clone()),use(new size_t(1)){}
像默认构造函数一样,这个构造函数分配并初始化使用计数,它调用形参的clone产生那个对象的虚副本,如果实参是Item_base对象,则运行Item_base的clone函数。如果是Bulk_item对象则执行它的clone函数。

分享到:
评论

相关推荐

    C++典型句柄类的实现

    演示了继承中的易错点,演示了两种常用C++句柄类的封装方式,前者适用于类的基类指针管理以便实现多态,后者不仅管理基类指针还管理子类对象的创建。

    C++实现句柄类

    用C++实现的句柄类,有利于初学者理解什么是句柄~~

    c++ vc6 句柄类

    c++ vc6 句柄类

    C++句柄类实现和使用

    本文件包含了实现句柄类的源文件,通常我们不能将基类和派生类对象同时存储在一个容器中,比如vector或者multiset,代码中通过利用句柄类解决了这个问题。详细解释可以参考博文...

    C++指针及句柄

    C++指针及句柄,深入理解 指针的奥秘 .

    c++笔记之句柄类

    句柄类存储和管理基类指针。指针所指的对象的类型可以变化,即可以指向基类对戏那个又可以指向派生类类型对象。用户通过句柄类访问继承层次的操纵。因为句柄类使用指针执行操作,虚成员的行为将在运行时根据句柄实际...

    C++查看窗口句柄的源码findwindow

    类似SPY++查看窗口句柄,CLASS,并可以修改窗口名称的源码。

    C++中句柄和指针的区别

    C++中句柄和指针的区别,从广义上,能够从一个数值拎起一大堆数据的东西都可以叫做句柄。句柄的英文是"Handle",本义就是"柄",只是在计算机科学中,被特别地翻译成"句柄",其实还是个"柄"。从一个小东西拎起一大堆...

    获得窗体句柄函数总结

    获得句柄函数总结 获得句柄函数总结 获得句柄函数总结

    得到指定进程所占用的句柄数_NtQueryInformationProcess第二个参数为20.zip

    得到指定进程所占用的句柄数handle_NtQueryInformationProcess第二个参数为20.zip

    通过进程ID找到窗口句柄.

    通过进程ID找到窗口句柄.通过进程ID找到窗口句柄.通过进程ID找到窗口句柄.通过进程ID找到窗口句柄.通过进程ID找到窗口句柄.通过进程ID找到窗口句柄.通过进程ID找到窗口句柄.通过进程ID找到窗口句柄.

    详解C++句柄类

    本篇文章给大家详细分析了C++句柄类的相关知识点,对此有需要的朋友跟着学习参考下吧。

    删除程序的 mutex 互斥句柄

    游戏外挂 多开用的上 mutex 互斥体 game dll

    c#与c++Dll 普通函数、回调函数、句柄显示图片

    1、普通函数调用 2、dll内子线程回调函数 3、借助OpenCV将dll图片显示到c#句柄(暂未实现 参照https://blog.csdn.net/u012250337/article/details/51601905)

    c# 句柄类库 .net操作句柄

    c# 句柄类库 .net操作句柄.自动生成查找句柄的类.很强悍

    指定窗口截图,窗口句柄截图

    根据窗口句柄截取任意窗口图片 VS2008

    CreateProcess调用后,获得主窗口句柄

    用CreateProcess创建进程后,得到主窗口句柄。

    非托管C++调用C#的dll

    C#调用C++编写的dll,一般都是直接用dllimport,这个资料很多。C++调用C#编写的dll,一般方法都是先用托管C++将C#的dll进行一次封装,然后由非托管C++调用封装好的dll。

    e语言-句柄操作类易语言模块

    资源介绍:通过句柄操作创建,发送文本消息,发送消息,禁止,可视,取标题, 取窗口风格,取窗口扩展风格,取当前句柄,取父句柄,取类名,取内容,取上一个句柄,取下一个句柄,取子句柄,通过标题创建,通标题...

Global site tag (gtag.js) - Google Analytics