【ThinkingInC++】32、一个句柄类

头文件

/**
* 功能:句柄类,头文件只包含公共的接口和单一的指针,该指针指向一个没有
        完全定义的类
* 时间:2014年8月25日07:52:42
* 作者:cutter_point
*/
#ifndef HANDLE_H_INCLUDED
#define HANDLE_H_INCLUDED

class Handle
{
    struct Cheshire;    //这个只是声明,如果要改变Cheshire的组成,唯一要重新编译的是
                        //Handle因为头文件并没有动
    Cheshire* smile;    //来!微笑^_^
public:
    void initialize();  //初始化
    void cleanup();     //回收内存
    int read();         //输出当前的数据
    void change(int);   //改变当前的值
};

#endif // HANDLE_H_INCLUDED

声明文件

/**
* 功能:包含具体实现的结构体被隐藏在实现文件中
* 时间:2014年8月25日07:52:37
* 作者:cutter_point
*/

#include"Handle.h"
#include"../require.h"

//定义Handle的接口
//    struct Cheshire;    //这个只是声明
struct Handle::Cheshire
{
    int i;
};

//    void initialize();  //初始化
void Handle::initialize()
{
    smile=new Cheshire; //其实这个机构体就一个int的大小
    smile->i=0; //大小初始化为0
}

//    void cleanup();     //回收内存
void Handle::cleanup()
{
    delete smile;   //清除指针指向的结构
}

//    int read();         //输出当前的数据
int Handle::read()
{
    return smile->i;    //返回当前指针指向的对象的值
}

//    void change(int);   //改变当前的值
void Handle::change(int x)
{
    smile->i=x;
}

测试文件

/**
* 功能:包含具体实现的结构体被隐藏在实现文件中
* 时间:2014年8月8日10:08:19
* 作者:cutter_point
*/

#include"Handle.cpp"

int main()
{
    Handle u;
    u.initialize();
    u.read();
    u.change(1);
    u.cleanup();

    return 0;
}
时间: 2024-10-24 20:00:01

【ThinkingInC++】32、一个句柄类的相关文章

句柄类与继承

前一小节<容器与继承>http://blog.csdn.net/thefutureisour/article/details/7744790提到过: 对于容器,假设定义为基类类型,那么则不能通过容器訪问派生类新增的成员:假设定义为派生类类型,一般不能用它承载基类的对象,即使利用类型转化强行承载,则基类对象能够訪问没有意义的派生类成员,这样做是非常危急的.对这个问题的解决的方法,是使用容器保存基类的指针. 在C++中,这类问题有一种通用的解决的方法,称为句柄类.它大体上完毕双方面的工作: 1.管

C++ 句柄类

一.容器与继承 在容器中保存有继承关系的对象时,如果定义成保存基类对象,则派生类将被切割,如果定义成保存派生类对象,则保存基类对象又成问题(基类对象将被强制转换成派生类对象,而派生类中定义的成员未被初始化).     唯一的可行的选择是容器中保存对象的指针.但是需要用户管理对象和指针.C++中一个通用的技术是包装类(cover)或句柄类(handle).用句柄类存储和管理类指针. 句柄类大体上完成两方面的工作: 管理指针,这与智能指针的功能类似. 实现多态,利用动态绑定,是得指针既可以指向基类,

C++ Primer 学习笔记_83_模板与泛型编程 --一个泛型句柄类

模板与泛型编程 --一个泛型句柄类 引言: [小心地雷] 这个例子体现了C++相当复杂的语言应用,理解它需要很好地理解继承和模板.在熟悉了这些特性之后再研究这个例子也许会帮助.另一方面,这个例子还能很好地测试你对这些特性的理解程度. 前面示例的Sales_item和Query两个类的使用计数的实现是相同的.这类问题非常适合于泛型编程:可以定义类模板管理指针和进行使用计数.原本不相关的Sales_item类型和 Query类型,可通过使用该模板进行公共的使用计数工作而得以简化.至于是公开还是隐藏下

智能指针与句柄类(四)

当我们希望使用容器来保存继承体系中的对象时,容器用于继承体系中的类型会有影响:派生类对象复制到基类对象时,派生类对象将被切掉.那么解决这一问题的方法通常是使用容器保存基类对象的指针,这些指针实际指向的是程序运行时动态分配的派生类对象,用户必须保证在容器析构前调用delete来释放动态分配的对象,如下例: 1 class Base 2 { 3 public: 4 virtual void action() = 0; 5 }; 6 class Derived1 : public Base 7 {..

智能指针与句柄类(二)

之前文章提到写时复制(copy-on-write)技术,要实现这种功能,针对上文中Handle代码,需要将size_t * use这个抽象出来,封装成一个引用计数类,提供写时复制功能.CUseCount类实现如下: 1 class CUseCount 2 { 3 public: 4 CUseCount(); 5 CUseCount(const CUseCount&); 6 ~CUseCount(); 7 8 bool only()const; //判断引用计数是否为0, 句柄类无法访问priva

智能指针与句柄类(三)

之前文章中实现的写时复制,句柄类中引用计数和T类型指针是分开的,这里换一种方式来处理,将引用计数和T类型指针视为一个整体,当做句柄类模板参数.先对上节中的引用计数进行改造: 1 class CUseCount 2 { 3 public: 4 CUseCount(); 5 CUseCount(const CUseCount&); 6 CUseCount& operator=(const CUseCount&); 7 ~CUseCount(); 8 9 void markUnshare

C++ Primer 学习笔记_71_面向对象编程 --句柄类与继承

面向对象编程 --句柄类与继承 引言: C++中面向对象编程的一个颇具讽刺意味的地方是:不能使用对象支持面向对象编程,相反,必须使用指针或引用. void get_prices(Item_base object, Item_base *pointer, Item_base &reference){ //需要根据指针或引用实际所绑定的类型进行调用 cout<< pointer ->net_price(1)<< endl; cout<< reference.n

智能指针与句柄类(一)

句柄类/智能指针(smart point)是存储指向动态分配(堆)对象指针的类.除了能够在适当的时间自动删除指向的对象外,他们的工作机制很像C++的内置指针.句柄类实际上是通过复制指向引用计数器类型的指针,来代替复制实际对象:从而使得复制对象变成复制指针,实现虚拟复制(即是用复制对象的地址代替复制对象本身),以提高内存效率和访问速度. 引用计数是复制控制成员中使用的技术,跟踪该类有多少个对象共享一个指针.引用计数与共享对象一起存储,需要创建一个单独类指向共享对象并管理引用计数.由构造函数而不是赋

PHP用单例模式实现一个数据库类

使用单例模式的出发点: 1.php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源. 2.如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分. 3.在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo. 创造单例注意: 1