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

C++模块化之内部类

目录

1.引言

2.内部类的访问控制

3.优缺点分析

4.实际运用

4.1.实现复杂数据结构

4.2.封装细节实现

4.3.事件处理和回调

4.4.模板元编程辅助类

4.5. 访问控制和封装

4.6. 代码组织和模块化

5.总结


1.引言

        在C++中,内部类(Nested Class)是一种相对不太常用但却非常强大的编程工具。就是在一个类内部定义另外一个类,注意此时这个内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去调用内部类。外部类对内部类没有任何优越的访问权限。

        注意:内部类就是外部类的友元类。注意友元类的定义,内部类可以通过外部类的对象参数来访问外部类中的所有成员,不管是public、protected、private。但是外部类不是内部类的友元。

下面是一个简单的内部类的例子:

#include <iostream>  
using namespace std;  class Outer {  
public:  int outerValue;  class Inner {  public:  void display() {  // 直接访问外部类的公有成员  cout << "Outer value: " << outerValue << endl;  }  };  Inner inner;  
};  int main() {  Outer outer;  outer.outerValue = 10;  outer.inner.display(); // 访问内部类的成员函数  return 0;  
}

在这个例子中,Inner类是在Outer类的内部定义的。Inner类可以直接访问Outer类的公有成员outerValue。在main函数中,我们首先创建了Outer类的对象outer,然后设置了它的outerValue成员的值,最后调用了内部类Inner的成员函数display来显示outerValue的值。

2.内部类的访问控制

内部类与外部类之间的访问控制是C++中的一个重要特性。内部类可以访问外部类的私有和保护成员,反之亦然。这使得内部类可以更方便地操作外部类的内部状态。以下是一个例子:

class OuterClass {
private:int outerValue;public:OuterClass(int value) : outerValue(value) {}class InnerClass {public:void display(const OuterClass& outer) {std::cout << "Outer class value: " << outer.outerValue << std::endl;}};
};int main() {OuterClass outer(42);OuterClass::InnerClass inner;inner.display(outer);return 0;
}

在这个例子中,InnerClass通过传递一个OuterClass对象的引用来访问其私有成员outerValue。这种设计使得内部类可以直接与外部类进行交互,而不需要暴露外部类的私有成员。

注意内部类可以直接访问外部类中的static、枚举成员,不需要外部类的对象/类名。

class A
{
public: class B{void foo(){cout << k <<endl;//OK//cout << h <<endl;// ERROR}};private: static int k;int h;
};
int A::k=3;

内部类可以现在外部类中声明,然后在外部类外定义:

class A
{
public: class B;private: static int i;
};class A::B
{
public:void foo(){cout << i <<endl;}//!!!这里也不需要加A::i.
};int A::i=3;

3.优缺点分析

优点

        封装性增强:

        内部类可以帮助将一个类的实现细节封装起来,避免外部直接访问这些细节。通过内部类,可以更方便地访问外部类的私有成员,而无需将这些成员暴露给外部世界,从而增强了类的封装性。

        内部类可以声明为private或protected,进一步限制其访问范围,实现更好的信息隐藏。

        模块化:

        内部类使得相关的功能可以集中在一个地方,提高了代码的可读性和维护性。尤其是在实现复杂的数据结构(如树、图)时,内部类可以用来表示节点或边,使得数据结构的实现更加清晰和紧凑。

        作用域控制:

        内部类的作用域被限制在外部类的范围内,这有助于避免命名冲突和不必要的依赖。同时,这种设计也使得内部类的使用更加局部化,减少了全局作用域中的类数量。

        访问控制灵活性:

        内部类可以访问外部类的所有成员(包括私有成员),这为类之间的数据共享和交互提供了便利。同时,通过调整内部类的访问修饰符(如public、protected、private),可以对内部类的访问进行灵活控制。

        实现隐藏:

        在一些需要隐藏实现细节的场景中,内部类可以有效地将这些细节封装起来。例如,在数据库连接池的实现中,可以使用内部类来封装连接的管理逻辑。

缺点

        复杂性增加:

        虽然内部类可以提高封装性和模块化,但它们也可能增加代码的复杂性。当嵌套层次较多时,理解和维护代码可能会变得更加困难。

        可读性问题:

        对于不熟悉内部类设计模式的开发者来说,内部类可能会降低代码的可读性。因此,在使用内部类时,需要提供充分的注释和文档来解释其设计目的和使用方式。

        访问限制:

        尽管内部类可以访问外部类的私有成员,但外部类不能直接访问内部类的私有成员(除非通过内部类的对象)。这可能会在某些情况下限制设计的灵活性。

        编译器支持:

        尽管大多数现代C++编译器都支持内部类,但在一些特殊情况下,可能会遇到编译器特有的问题或限制。因此,在跨平台开发时需要注意编译器之间的差异。

4.实际运用

内部类在实际编程中有着广泛的应用,以下是几个常见的场景:

4.1.实现复杂数据结构

在实现如树、图等复杂数据结构时,内部类可以用来表示节点或边,从而使得数据结构的实现更加清晰和紧凑。例如,在实现二叉树时,可以将节点定义为内部类:

class BinaryTree {  
private:  struct Node {  int value;  Node* left;  Node* right;  Node(int val) : value(val), left(nullptr), right(nullptr) {}  };  Node* root;  
public:  BinaryTree() : root(nullptr) {}  // 添加节点、删除节点等函数  
};

4.2.封装细节实现

在一些需要隐藏实现细节的场景中,内部类可以有效地将这些细节封装起来。例如,在实现一个加密算法,在某种特殊的情况下,我想隐藏这个加密算法实现,那么就可以把这个加密算法封装在类的内部,通过接口提供出来,代码如下:

#include <iostream>
#include <string>//加密接口
class IDecrypt
{
public:virtual std::string  encryptDecrypt(const std::string& input, char key) = 0;
};//一种加密实现
class CBasicDecrypt : public IDecrypt
{
public:std::string encryptDecrypt(const std::string& input, char key) override {std::string output = input;for (size_t i = 0; i < input.length(); ++i) {output[i] = input[i] ^ key;}return output;}
};class CMyBusiness
{...protected://我的加密实现class CMyDecrypt : public IDecrypt{public:std::string encryptDecrypt(const std::string& input, char key) override {std::string output = input;for (size_t i = 0; i < input.length(); ++i) {output[i] = input[i] | key;}return output;}       };public://通过接口给外界使用,隐藏它的实现IDecrypt* getDecrypt() {return &m_myDecrypt;}private:CMyDecrypt  m_myDecrypt;
};

4.3.事件处理和回调

在GUI编程或需要事件处理机制的应用中,内部类常用于实现事件处理和回调函数。例如,在一个按钮点击事件处理中,可以使用内部类来封装事件处理逻辑:

class Button {  
public:  class ClickListener {  public:  virtual void onClick() = 0;  };  
private:  ClickListener* listener;  
public:  void setClickListener(ClickListener* listener) {  this->listener = listener;  }  void click() {  if (listener) {  listener->onClick();  }  }  
};

4.4.模板元编程辅助类

        在进行模板元编程时,内部类可以用作辅助类,以提供额外的类型信息和操作。这些内部类有助于实现更复杂的模板逻辑和类型转换。

4.5. 访问控制和封装

        内部类提供了一种灵活的访问控制机制。通过将内部类声明为private或protected,可以限制外部代码对内部类的访问,从而增强类的封装性。同时,内部类可以访问外部类的私有成员,这为实现紧密耦合的类关系提供了便利。

4.6. 代码组织和模块化

        内部类有助于将相关的功能组织在一起,提高代码的可读性和可维护性。通过将辅助类或工具类定义为内部类,可以减少全局命名空间的污染,并使代码结构更加清晰。

5.总结

        综上所述,C++内部类在实际应用中具有广泛的应用场景,包括实现复杂数据结构、封装细节实现、事件处理和回调、模板元编程辅助类以及代码组织和模块化等方面。通过合理使用内部类,可以提高代码的封装性、可读性和可维护性。

相关文章:

C++模块化之内部类

目录 1.引言 2.内部类的访问控制 3.优缺点分析 4.实际运用 4.1.实现复杂数据结构 4.2.封装细节实现 4.3.事件处理和回调 4.4.模板元编程辅助类 4.5. 访问控制和封装 4.6. 代码组织和模块化 5.总结 1.引言 在C中&#xff0c;内部类&#xff08;Nested Class&#xff…...

k8s-第九节-命名空间

命名空间 如果一个集群中部署了多个应用&#xff0c;所有应用都在一起&#xff0c;就不太好管理&#xff0c;也可以导致名字冲突等。 我们可以使用 namespace 把应用划分到不同的命名空间&#xff0c;跟代码里的 namespace 是一个概念&#xff0c;只是为了划分空间。 # 创建命…...

【AI大模型新型智算中心技术体系深度分析 2024】

文末有福利&#xff01; ChatGPT 系 列 大 模 型 的 发 布&#xff0c; 不 仅 引 爆 全 球 科 技 圈&#xff0c; 更 加 夯 实 了 人 工 智 能&#xff08;Artificial Intelligence, AI&#xff09;在未来改变人类生产生活方式、引发社会文明和竞争力代际跃迁的战略性地位。当…...

王道计算机数据结构+插入排序、冒泡排序、希尔排序、快速排序、简单选择排序

本内容是基于王道计算机数据结构的插入排序、冒泡排序、希尔排序、快速排序、简单选择排序整理。 文章目录 插入排序算法性能代码 冒泡排序算法性能代码 希尔排序算法性能代码 快速排序算法性能代码 简单选择排序算法性能代码 插入排序 算法 算法思想&#xff1a;每次将一个…...

python爬虫学习(三十三天)---多线程上篇

hello&#xff0c;小伙伴们&#xff01;我是喔的嘛呀。今天我们来学习多线程方面的知识。 目录 一、了解多线程 &#xff08;1&#xff09;大概描述 &#xff08;2&#xff09;多线程爬虫的优势 &#xff08;3&#xff09;多线程爬虫的实现方式 &#xff08;4&#xff09…...

JavaScript 原型链那些事

在讲原型之前我们先来了解一下函数。 在JS中&#xff0c;函数的本质就是对象&#xff0c;它与其他对象不同的是&#xff0c;创建它的构造函数与创建其他对象的构造函数不一样。那产生函数对象的构造函数是什么呢&#xff1f;是一个叫做Function的特殊函数&#xff0c;通过newFu…...

nginx的知识面试易考点

Nginx概念 Nginx 是一个高性能的 HTTP 和反向代理服务。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好。 Nginx 专为性能优化而开发&#xff0c;性能是其最重要的考量指标&#xff0c;实现上非常注重效率&#…...

每日Attention学习9——Efficient Channel Attention

模块出处 [CVPR 20] [link] [code] ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks 模块名称 Efficient Channel Attention (ECA) 模块作用 通道注意力 模块结构 模块代码 import torch import torch.nn as nn import torch.nn.functional …...

Java语言程序设计——篇三(1)

选择结构 概述选择单分支if语句例题讲解 双分支if-else语句例题讲解 条件运算符多分支的if-else语句例题讲解 嵌套的if语句例题讲解 switch语句结构例题讲解代码演示运行结果 概述 Java中的控制结构&#xff0c;包括&#xff1a; 1、选择结构( if、if-else、switch ) 2、循环结…...

基于SpringBoot实现轻量级的动态定时任务调度

在使用SpringBoot框架进行开发时&#xff0c;一般都是通过Scheduled注解进行定时任务的开发&#xff1a; Component public class TestTask {Scheduled(cron"0/5 * * * * ? ") //每5秒执行一次public void execute(){SimpleDateFormat df new SimpleDateFormat(…...

夸克升级“超级搜索框” 推出AI搜索为中心的一站式AI服务

大模型时代&#xff0c;生成式AI如何革新搜索产品&#xff1f;阿里智能信息事业群旗下夸克“举手答题”。7月10日&#xff0c;夸克升级“超级搜索框”&#xff0c;推出以AI搜索为中心的一站式AI服务&#xff0c;为用户提供从检索、创作、总结&#xff0c;到编辑、存储、分享的一…...

element-ui el-select选择器组件下拉框增加自定义按钮

element-ui el-select选择器组件下拉框增加自定义按钮 先看效果 原理&#xff1a;在el-select下添加禁用的el-option&#xff0c;将其value绑定为undefined&#xff0c;然后覆盖el-option禁用状态下的默认样式即可 示例代码如下&#xff1a; <template><div class…...

Python基于you-get下载网页上的视频

​ 1.python 下载地址 下载 : https://www.python.org/downloads/ 2. 配置环境变量 配置 python_home 地址 配置 python_scripts 地址 在path 中加入对应配置 3. 验证 ​ C:\Users>python --version Python 3.12.4C:\Users>wheel version wheel 0.43.04. 下载 c…...

大模型/NLP/算法面试题总结3——BERT和T5的区别?

1、BERT和T5的区别&#xff1f; BERT和T5是两种著名的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;它们在架构、训练方法和应用场景上有一些显著的区别。以下是对这两种模型的详细比较&#xff1a; 架构 BERT&#xff08;Bidirectional Encoder Representation…...

vue3项目打包的时候,怎么区别测试环境,和本地环境

在Vue 3项目中区别测试环境和本地环境&#xff0c;并标记接口的方法可以通过环境变量来实现。 首先&#xff0c;你可以在你的项目根目录下创建一个.env文件&#xff0c;并定义你的环境变量。比如&#xff0c;你可以创建.env.local作为本地环境的配置文件&#xff0c;.env.test…...

小特性 大用途 —— YashanDB JDBC驱动的这些特性你都get了吗?

在现代数据库应用场景中&#xff0c;系统的高可用性和负载均衡是确保服务稳定性的基石。YashanDB JDBC驱动通过其创新的多IP配置特性&#xff0c;为用户带来了简洁而强大的解决方案&#xff0c;以实现数据库连接的高可用性和负载均衡&#xff0c;满足企业级应用的高要求。 01 …...

全网最全的软件测试面试八股文

前面看到了一些面试题&#xff0c;总感觉会用得到&#xff0c;但是看一遍又记不住&#xff0c;所以我把面试题都整合在一起&#xff0c;都是来自各路大佬的分享&#xff0c;为了方便以后自己需要的时候刷一刷&#xff0c;不用再到处找题&#xff0c;今天把自己整理的这些面试题…...

VMware虚拟机配置桥接网络

转载&#xff1a;虚拟机桥接网络配置 一、VMware三种网络连接方式 VMware提供了三种网络连接方式&#xff0c;VMnet0, VMnet1, Vmnet8&#xff0c;分别代表桥接&#xff0c;Host-only及NAT模式。在VMware的编辑-虚拟网络编辑器可看到对应三种连接方式的设置&#xff08;如下图…...

华为机考真题 -- 攀登者1

题目描述: 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 一个山脉可能有多座山峰(山峰定义:高度大于相邻位置的高度,或在地图边界且高度大于相邻的高度)。登山者…...

深入理解Python密码学:使用PyCrypto库进行加密和解密

深入理解Python密码学&#xff1a;使用PyCrypto库进行加密和解密 引言 在现代计算领域&#xff0c;信息安全逐渐成为焦点话题。密码学&#xff0c;作为信息保护的关键技术之一&#xff0c;允许我们加密&#xff08;保密&#xff09;和解密&#xff08;解密&#xff09;数据。P…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...