当前位置: 首页 > ops >正文

C++句柄类

假设有一个父类base,然后从base继承了多个子类base1,base2等等,C++句柄类主要是用来管理多个子类,统一个的接口,不同的操作.

句柄类需要智能指针的基础知识和多态的知识,句柄类其实就是智能指针+多态知识.如果,对智能指针不是很了解,可以查看我上篇博客.

直接看代码如下:

#include <iostream>
#include <string>
class animal
{
public:virtual animal* clone() const=0;virtual void eat() const = 0;virtual void haul() const = 0;
};class cat:public animal
{
public:cat(std::string n):name(n){std::cout<<"create cat:"<<name<<std::endl;}~cat(){}virtual animal* clone() const{return new cat(*this);}virtual void eat() const{std::cout<<name<<" \teat"<<std::endl;}virtual void haul() const{std::cout<<name <<" \thaul"<<std::endl;}
private:std::string name;
};class dog:public animal
{
public:dog(std::string n):name(n){std::cout<<"create dog:"<<name<<std::endl;}~dog(){}virtual animal* clone() const{return new dog(*this);}virtual void eat() const{std::cout<<name<<" \teat"<<std::endl;}virtual void haul() const{std::cout<<name <<" \thaul"<<std::endl;}
private:std::string name;
};class handle
{
public:handle():an(NULL),use(new std::size_t(1)){}handle(const animal&);handle(const handle& h):an(h.an),use(h.use){++*use;}handle& operator=(const handle&);~handle(){decr_use();}const animal* operator->()const {if(an) return an;elsereturn (animal*)-1;}const animal* operator*() const {if(an) return an;elsereturn (animal*)-1;}
private:animal *an;std::size_t *use;void decr_use(){if (--*use==0) {//std::cout<<"use is = "<<*use<<std::endl;delete an;delete use;}}
};handle::handle(const animal &an):an(an.clone()),use(new std::size_t(1)){    }handle& handle::operator=(const handle& h)
{++*h.use;decr_use();an=h.an;use=h.use;return *this;
}


以下是测试函数,

<span style="font-size:18px;">#include "smart_ptr.h"
#include <iostream>int main(void)
{cat c("tom");dog d("jim");handle h(c);h->eat();//通过重载->操作符实现(*h)->haul();//通过重载*操作符实现handle h1(d);h1->eat();(*h1)->haul();// handle *h2=new handle(h);// delete h2;return 0;
}</span>
输出结果为:


可以看到通过传给句柄类不同的子类,同样的接口却调用不同的子类的函数,实现了多态.我注释掉的那两行,主要时用来验证智能指针的,因为有指针成员,必须使用智能指针,保证指针安全.


http://www.xdnf.cn/news/11678.html

相关文章:

  • 从CM刷机过程和原理分析Android系统结构
  • flash模块开发
  • Windows服务器创建定时任务
  • 在 Java 应用程序中访问USB设备-Java基础-Java-编程开发
  • [紧急通告]关于蓝色理想经典论坛无法访问的声明
  • ch8_2_CPU的指令周期,流水线技术
  • 大富豪3(GM商城版)新手攻略之购买土地
  • 分享60个ASP精品程序源码,总有一款适合您
  • 常见邮件服务器(接收服务器和发送邮件服务器)地址
  • PostgreSQL的B-tree索引
  • NC 54585 DP + BIT
  • 破解隔壁wifi的实践——网络攻击,抓取握手包,解包
  • .net发送邮件失败的部分解决方法
  • 【网络管理工具】NETworkManager工具的基本使用教程
  • C#(asp.net)电商后台管理系统-计算机毕业设计源码70015
  • AI技术:分享8个非常实用的AI绘画网站
  • Oracle minus用法详解及应用实例
  • MT8377 MT8389 MT6589 MT6577解析
  • linux文件目录:/etc/profile文件
  • VB入门在线视频教程大全学习
  • 织梦采集侠破解版_最新dedecms织梦采集侠v2.6破解版
  • NAT、PAT的原理及配置
  • ANN(人工神经网络)基础知识
  • 数据库挖掘 概念 定义 什么是数据挖掘
  • 数字电路设计——断线报警器的仿真与实物制作
  • qq盗号的小插件 各位同胞注意别被骗了
  • android 3d壁纸源码,3D Wallpaper Parallax app下载-3D Wallpaper Parallax(3D视差壁纸)下载v1.3安卓版-西西软件下载...
  • 【pytorch】加载部分模型参数及冻结部分参数
  • 经典组合 | PTS + ARMS打造性能和应用诊断利器
  • Unix操作系统的前世今生