C++:适配器

正文

当两个类的接口不兼容时,可以使用适配器模式将一个类的接口适配成另一个类的接口,使它们可以协同工作。下面是一个简单的示例,展示如何使用适配器模式将一个旧的类的接口适配成一个新的类的接口

假设有一个旧的类 OldClass,它有一个名为 oldMethod 的方法,但我们希望将其适配成一个新的类 NewClass,并且新类中有一个名为 newMethod 的方法。我们可以使用适配器模式来实现这个转换:

// 旧的类
class OldClass {
public:
    void oldMethod() {
        std::cout << "Old method is called." << std::endl;
    }
};

// 新的类
class NewClass {
public:
    void newMethod() {
        std::cout << "New method is called." << std::endl;
    }
};

// 适配器类,将 OldClass 的接口适配成 NewClass 的接口
class Adapter {
private:
    OldClass oldObj;

public:
    void newMethod() {
        oldObj.oldMethod(); // 调用旧类的方法
    }
};

int main() {
    Adapter adapter;
    adapter.newMethod(); // 调用适配后的新类方法,实际上会调用旧类的方法
    return 0;
}

在上面的示例中,OldClass 是旧的类,NewClass 是新的类,它们的接口不兼容(假设不兼容,嘻嘻)。通过创建一个适配器类 Adapter,在适配器类中调用旧类的方法,从而实现将旧类的接口适配成新类的接口。在 main 函数中,我们创建了一个适配器对象,并调用了适配后的新类方法,实际上会调用旧类的方法。

事实上,适配器的概念在 STL 中非常重要,很多的适配器都是基于 STL 提供的容器来实现。换句话说,就是通过 STL 提供的容器来构造要求更高的容器。

在 C++ STL(标准模板库)中,有许多适配器类模板,用于基于不同的容器类型来实现不同的数据结构。这些适配器类模板提供了统一的接口,使得可以通过适配器来构造具有特定功能的容器,从而满足不同的需求。

template<typename _Tp, typename _Sequence = deque<_Tp> >
class stack
{

public:
    typedef typename _Sequence::value_type                value_type;
    typedef typename _Sequence::reference                 reference;
    typedef typename _Sequence::const_reference           const_reference;
    typedef typename _Sequence::size_type                 size_type;
    typedef          _Sequence                            container_type;

protected:
    //  See queue::c for notes on this name.
    _Sequence c;

public:
     reference
      top()
      {
        __glibcxx_requires_nonempty();
        return c.back();
      }
    void
      push(const value_type& __x)
      { c.push_back(__x); }
}

例如,std::stack 是一个栈适配器,它基于其他容器实现的栈数据结构。默认情况下,std::stack 使用 std::deque(双端队列)作为其底层容器,但也可以通过模板参数指定其他容器类型,如 std::vectorstd::list

类似地,std::queue 是一个队列适配器,它基于其他容器实现的队列数据结构。默认情况下,std::queue 使用 std::deque 作为其底层容器:

template<typename _Tp, typename _Sequence = deque<_Tp> >
class queue
{
public:
    typedef typename _Sequence::value_type                value_type;
    typedef typename _Sequence::reference                 reference;
    typedef typename _Sequence::const_reference           const_reference;
    typedef typename _Sequence::size_type                 size_type;
    typedef          _Sequence                            container_type;

protected:

    _Sequence c;

public:

    void push(const value_type& __x)
    { c.push_back(__x); }

    void pop()
    { 
        __glibcxx_requires_nonempty();
      c.pop_front();
    }
}

另外,std::priority_queue 是一个优先队列适配器,它基于其他容器实现的优先队列数据结构。默认情况下,std::priority_queue 使用 std::vector 作为其底层容器,但也可以通过模板参数指定其他容器类型:

template<typename _Tp, typename _Sequence = vector<_Tp>,
typename _Compare  = less<typename _Sequence::value_type> >
class priority_queue
{
public:
    typedef typename _Sequence::value_type                value_type;
    typedef typename _Sequence::reference                 reference;
    typedef typename _Sequence::const_reference           const_reference;
    typedef typename _Sequence::size_type                 size_type;
    typedef          _Sequence                            container_type;

protected:
    //  See queue::c for notes on these names.
    _Sequence  c;
    _Compare   comp;

public:
    reference
    top() 
    {
	    __glibcxx_requires_nonempty();
	    return c.front();
    }

    void
    push(const value_type& __x)
    {
	    c.push_back(__x);
	    std::push_heap(c.begin(), c.end(), comp);
    }

}

这些适配器类模板使得在不同场景下可以方便地使用不同的容器实现,同时提供了统一的接口,使得代码更加灵活和可复用。通过使用 STL 提供的适配器,可以更加方便地构造具有特定功能的容器,满足不同的需求。因此,stack、queue、priority_queue不被称为容器, 把它称为容器配接器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/572951.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞复现】云时空社会化商业ERP系统LoginName SQL注入漏洞

漏洞描述&#xff1a; 云时空社会化商业ERP系统loginName存在SQL注入漏洞&#xff0c;攻击者可以通过此漏洞获取数据库敏感信息。 搜索语法: Fofa-Query: app"云时空社会化商业ERP系统" 漏洞详情&#xff1a; 1.云时空社会化商业ERP系统。 2.漏洞POC&#xff1a…

倒计时开始!Big Demo Day第十二期,揭秘DePIN,探索Web3未来(附参会指南)

香港—— 全球领先的 Web3.0 活动 Big Demo Day 第十二期即将于 4 月 26 日在香港数码港盛大举行。本次活动由知名科技企业 ZeeprLabs 赞助&#xff0c;Central Research 主办&#xff0c;并得到 Techub News 的联合主办以及数码港、852Web3 等机构的合作支持。 在过去的 11 期…

鸿蒙HarmonyOS应用 - ArkUI组件

ArkUI组件 基础组件 Image 声明Image组件并设置图片源 网络权限&#xff1a;ohos.permission.INTERNET Image(scr: string | PixelMap | Resource)// 1. string&#xff1a;用于加载网络图片&#xff0c;需要申请网络权限 Image("https://xxx.png")// 2. PixelMap…

驱鸟器低成本OTP语音方案选型-wtn6020唯创知音

一、开发背景&#xff1a; 随着农业现代化的不断推进&#xff0c;鸟类对农作物的侵扰问题愈发严重。传统的驱鸟方法&#xff0c;如人工驱赶或使用化学药剂&#xff0c;不仅效率低下&#xff0c;而且可能对环境造成污染。因此&#xff0c;开发一种高效、环保、低成本的驱鸟器成…

考研日常记录(upd 24.4.24)

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 文章目录 2024.4.18 周四课程情况&#xff1a;时间规划&#xff1a; 2024.4.19 周五课程情况&#xff1a;时间规划&#xff1a; 2024.4.20 周六2024.4.2…

RK3588构建ubuntu22.04根文件系统

前言 RK系列的平台提供了buildroot和debian的系统&#xff0c;使用脚本可以直接构建出来&#xff0c;但是没有提供ubuntu的系统&#xff0c;很多厂商只提供一个rootfs.img的固件包&#xff0c;没有将方法开源出来。本文实现了从ubuntu官网开始构建一个ubuntu22.04根文件系统。…

SSTV音频转图片

SSTV工具有很多&#xff0c;这里使用RX-SSTV慢扫描工具 下载安装 RX-SSTV解码软件 下载地址&#xff1a;https://www.qsl.net/on6mu/rxsstv.htm 一直点下一步&#xff0c;安装成功如下图: 虚拟声卡e2eSoft 由于SSTV工具是根据音频传递图片信息&#xff0c;正常解法需要一…

人耳的七个效应

1、掩蔽效应 • 人们在安静环境中能够分辨出轻微的声音&#xff0c;即人耳对这个声音的听域很低&#xff0c;但在嘈杂的环境中轻微的声音就会被淹没掉&#xff0c;这时将轻微的声音增强才能听到。 • 这种在聆听时&#xff0c;一个声音的听阈因另一声音的出现而提高的现象&…

本地修改localhost--手把手

找到本地hosts文件 1、C:\Windows\System32\drivers–快捷键ctrlR,输入drivers 2、点击etc目录&#xff0c;找到hosts文件&#xff0c;右键使用记事本方式打开编辑 3、添加自己想得到的域名【只能在本地使用】 127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com 127.0.0.…

面试:JVM内存结构

一、Java代码的运行步骤 一段Java代码先会被反编译为Java字节码&#xff0c;当执行java命令时&#xff0c;JVM虚拟机会被创建出来&#xff0c;并会创建一个main主线程来执行主方法。 二、JVM的内存结构有哪些&#xff1f; 1、方法区&#xff1a;&#xff08;线程共享&#xff…

Linux交换空间的创建使用

交换空间&#xff1a; 换出&#xff1a;将内存中不常用&#xff08;冷数据&#xff09;的放去硬盘里 换出&#xff1a;内存要使用这部分数据时&#xff0c;将硬盘的这部分数据放入内存 在内存和硬盘上用来交换数据的空间就是交换空间 创建交换空间的步骤 1.去磁盘上创建一个分…

Linux中的高级IO函数(一)pipe socketpair dup

Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数&#xff08;比如open和read&#xff09;那么常用&#xff08;编写内核模块时一般要实现这些I/O函数&#xff09;&#xff0c;但在特定的条件下却表现出优秀的性能。这些函数大致分为三类&#xff1a; 用于创建文件描…

Mongodb语法使用说明(含详细示例)

点击下载《Mongodb语法使用说明&#xff08;含详细示例&#xff09;》 1. 前言 MongoDB是一款高性能、开源、面向文档的NoSQL数据库&#xff0c;它使用类似JSON的BSON格式存储数据&#xff0c;提供了灵活的数据模型和强大的查询功能。本文将详细介绍MongoDB数据库的基本增删改…

CSS常用属性之(列表、表格、鼠标)属性,(如果想知道CSS的列表、表格、鼠标相关的属性知识点,那么只看这一篇就足够了!)

前言&#xff1a;在学习CSS的时候&#xff0c;必不可少的就要学习选择器和常见的属性&#xff0c;而本篇文章讲解的是CSS中的列表、表格、背景、鼠标属性。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客 大致了解一下本篇文章…

new String和直接赋值的一些问题

分析1 我们先看以下代码&#xff1a; String str1 "abc"; // 在常量池中String str2 new String("abc"); // 在堆上System.out.println(str1 str2)以上结果的输出是什么&#xff1f; 输出&#xff1a;false 前置知识&#xff1a; 在JVM中&#xff0c…

VForm3的文件上传后的一种文件回显方式

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

(C++) 内类生成智能指针shared_from_this介绍

文章目录 &#x1f601;介绍&#x1f914;类外操作&#x1f605;错误操作&#x1f602;正确操作 &#x1f914;类内操作&#x1f62e;std::enable_shared_from_this<>&#x1f62e;奇异递归模板 CRTP&#xff08;Curiously Recurring Template Pattern&#xff09;&#…

新手如何搭建测试平台?一文1800字从0到1实现【建议收藏】

01、职责 一个健康的测试平台体系&#xff0c;对测试人员的职责分工、协作模式会有不同的要求。 测试平台核心的职责是完成高质量的交付已满足业务需求。测试活动包括单元测试、集成测试、接口测试、性能测试等&#xff0c;都是通过这些测试手段&#xff0c;协同整个测试平台…

JavaEE 初阶篇-深入了解 UDP 通信与 TCP 通信(综合案例:实现 TCP 通信群聊)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 UDP 通信 1.1 DatagramSocket 类 1.2 DatagramPacket 类 1.3 实现 UDP 通信&#xff08;一发一收&#xff09; 1.3.1 客户端的开发 1.3.2 服务端的开发 1.4 实现 …

将Python机器学习模型集成到C++ Qt客户端应用程序中|Qt调用python详解

0、前言 有几个不同的选项可以将你的Python机器学习模型集成到你的C Qt客户端应用程序中。以下是一些可能的解决方案&#xff1a; 创建API&#xff1a; 将你的机器学习模型部署为一个API服务。你可以使用像Flask这样的轻量级Web框架来创建一个简单的HTTP服务。这样&#xff0…
最新文章