C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(4)

8.1、实现分区

        在模块接口分区文件中不需要声明分区,也可以在模块实现分区文件中进行声明,在一个以.cpp为扩展名的正常源代码文件中,在这种情况下,它是一个实现分区,有时候叫内部分区。这样的分区无法导出,与模块接口分区相比,它必须被模块接口主文件导出。

例如,假定有下面的math主模块接口文件(math.cppm):

export module math; // math module declarationexport namespace Math
{double superLog(double z, double b);double lerchZeta(double lambda, double alpha, double s);
}

        接着假设数学函数的实现需要辅助函数必须被模块导出。实现分区是放置这样的辅助函数的绝佳之地。下面在math_helpers.cpp文件中定义了实现分区:

module math:details;  // math:details implementation partitiondouble someHelperFunction(double a)
{// Implementation omitted...return 42;
}

        其它的模块实现文件可以通过导入这个实现分区来访问这些辅助函数。例如,math模块实现文件(math.cpp)可能看起来像这样:

module math;import :details;double Math::superLog(double z, double b)
{// Implementation omitted...return someHelperFunction(z);
}double Math::lerchZeta(double lambda, double alpha, double s)
{// Implementation omitted...return someHelperFunction(s);
}

        使用import  :details;声明,superLog()与lerchZeta()函数可以调用someHelperFunction()。

        当然了,使用这样的带有辅助函数的实现分区只有在多个其它源文件使用这些辅助函数时才说得通。

9、私有模块部分

        模块接口主文件可以包含私有模块部分。该私有模块部分以以下行开始:

module :private;

        这行之后的所有代码都是私有模块部分的代码。在这个私有模块部分定义的任何东东都不会导出,因此对模块的消费者也不可见。

        在《掌握类与对象》章节中演示了pimpl习语,也叫做私有实现习语。它隐藏了类的消费者的所有实现细节。在该章节中,解决方案要求两个文件:一个主模块接口文件和一个模块实现文件。使用私有模块部分,可以通过使用一个单独的文件来达到这个分隔。下面是一个准确的例子:

export module adder;import std;export class Adder
{
public:Adder();virtual ~Adder();int add(int a, int b) const;
private:class Impl;std::unique_ptr<Impl> m_impl;public:Impl* getImplementation() { return m_impl.get(); }
};module :private;class Adder::Impl
{
public:~Impl(){std::println("Destructor of Adder::Impl");}int add(int a, int b) const{return a + b;}
};Adder::Adder(): m_impl{ std::make_unique<Impl>() }
{
}Adder::~Adder() {}int Adder::add(int a, int b) const
{return m_impl->add(a, b);
}

        该类可以测试如下:

Adder adder;
println("Value: {}", adder.add(20, 22));

        现在,为了证明在私有模块部分中的所有代码都被隐藏,我们添加一个公共的成员函数getImplementation()在Adder类的尾部:

export class Adder
{/* ... as before, omitted for brevity ... */
private:class Impl;std::unique_ptr<Impl> m_impl;public:Impl* getImplementation() { return m_impl.get(); }
};

        下面的代码编译与运行都没有问题:

Adder adder;
auto impl { adder.getImplementation() };

        从Adder模块消费者的观点来看,getImplementation()返回一个指向不完整类型的指针。该代码片断在一个叫做impl的变量中保存该指针。只要用auto类型推演,简单把指针保存在不完整类型中是没有问题的。然而,不能对该指针进行任何操作。在该不完整的指针上调用add()会产生一个错误:

auto result { impl-­>add(20, 22) };// Error!

        这个错误有点像:使用未定义的类型Adder::Impl。原因是Adder::Impl类是私有模块部分的一部分,因此Adder模块的消费者无法访问。

        如果从模块接口文件中去掉module :private;这一行,前面的代码段编译与运行就没有问题了。乍一看会很吃惊;毕竟Adder::Impl类没有显式导出。这是正确的--它没有显式导出,但是它是隐式导出的,因为Adder类被导出,Impl类在Adder类中被声明。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

随着 AI 技术的不断发展,AI大模型正随着 AI 技术的不断发展,AI大模型正

随着 AI 技术的不断发展&#xff0c;AI大模型正在重塑软件开发流程&#xff0c;从代码自动生成到智能测试&#xff0c;未来&#xff0c;AI 大模型将会对软件开发者、企业&#xff0c;以及整个产业链都产生深远的影响。欢迎与我们一起&#xff0c;从 AI 大模型的定义、应用场景、…

数组对象常用方法合集

1、运算扩展符 ES6通过扩展元素符<font style"color:rgb(71, 101, 130);">...</font>&#xff0c;好比 <font style"color:rgb(71, 101, 130);">rest</font> 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 conso…

MATLAB基础应用精讲-【数模应用】平均绝对误差损失 Mean Absolute Error Loss(附python、R语言和MATLAB代码实现)

目录 前言 几个高频面试题目 RMSE与MAE对比 平均绝对误差和均方误差(L1&L2)比较 MAE与MSE的性质对比 2.1 敏感度 2.2 单位与解释 2.3 数学特性 优缺点分析 3.1 MAE的优缺点 3.2 MSE的优缺点 应用场景 4.1 MAE的应用 4.2 MSE的应用 均方根误差和平均绝对误差的…

SQL Server身份验证模式

SQL Server是一个广泛使用的关系数据库管理系统&#xff0c;通常使用两种身份验证模式&#xff1a;Windows身份验证和SQL Server身份验证。理解这些身份验证方式的概念与更改方式的操作&#xff0c;对于数据库管理员和开发者至关重要。本文将详细介绍身份验证方式的概念以及如何…

基于Spring Boot的信息学科平台系统开发指南

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于保密信息学科平台系统的相关信息成为必…

ArcGIS005:ArcMap常用操作101-150例动图演示

摘要&#xff1a;本文涵盖了GIS软件操作的多方面内容&#xff0c;包括地图文档的新建、打开、保存及版本兼容性处理&#xff1b;错误与警告的查阅及帮助文档的使用技巧&#xff1b;地图打印比例尺的调整与地图信息的完善&#xff1b;图层操作的撤销与恢复&#xff0c;界面元素的…

从零开始的c++之旅——继承

1. 继承 1.继承概念及定义 继承是面向对象编程的三大特点之一&#xff0c;它使得我们可以在原有类特性的基础之上&#xff0c;增加方法 和属性&#xff0c;这样产生的新的类&#xff0c;称为派生类。 继承 呈现了⾯向对象程序设计的层次结构&#xff0c;以前我们接触的…

【学习】软件测试中V模型、W模型、螺旋模型三者介绍

在软件工程的星辰大海之中&#xff0c;存在着三种独特的航路图&#xff1a;V模型、W模型以及螺旋模型。它们分别以各自的方式描绘了软件开发与测试的不同旅程。 首先映入眼帘的是V模型——一个以垂直线条贯穿始终的简洁图形。这个模型如同一座倒立的“V”字形山峰&#xff0c;…

SpringMVC笔记 一万字

此笔记来自于B站尚硅谷 文章目录 一、SpringMVC 简介1、什么是MVC2、什么是SpringMVC3、SpringMVC的特点 二、HelloWorld1、开发环境2、创建maven工程a>添加web模块b>打包方式&#xff1a;warc>引入依赖 3、配置web.xmla>默认配置方式b>扩展配置方式 4、创建请求…

Redis 分布式锁:原理、实现及最佳实践

随着现代互联网应用的不断发展&#xff0c;系统架构从单体应用逐步演变为分布式系统。为了保证分布式系统中的资源不被多个节点同时访问&#xff0c;确保数据的一致性和系统的稳定性&#xff0c;分布式锁的应用变得尤为重要。Redis 作为一个高性能的内存数据库&#xff0c;凭借…

【快速上手】pyspark 集群环境下的搭建(Standalone模式)

目录 前言 &#xff1a; 一、spark运行的五种模式 二、 安装步骤 安装前准备 1.第一步&#xff1a;安装python 2.第二步&#xff1a;在bigdata01上安装spark 3.第三步&#xff1a;同步bigdata01中的spark到bigdata02和03上 三、集群启动/关闭 四、打开监控界面验证 前…

Cloud Native Spring in Action

目录 设计原则 15 Factor App 数据验证和错误处理 测试 使用 Junit 5 进行单元测试 使用 SpringBootTest 进行集成测试 使用 WebMvcTest 测试 REST Controller 使用 JsonTest 测试 JSON 序列化 使用 DataJdbcTest 和 Testcontainers 测试数据持久化 使用 Reactor 和 …

三周精通FastAPI:31 使用 StaticFiles从目录中自动提供静态文件

官方文档&#xff1a;静态文件 - FastAPI 静态文件 您可以使用 StaticFiles从目录中自动提供静态文件。 使用StaticFiles 导入StaticFiles。"挂载"(Mount) 一个 StaticFiles() 实例到一个指定路径。 from fastapi import FastAPI from fastapi.staticfiles impo…

【双目视觉标定】——1原理与实践

0 前言 双目视觉定位是目前机器&#xff08;机器人&#xff09;等领域中使用得非常广泛的视觉定位技术&#xff0c;双目视觉是模拟人的视觉系统利用两个不同位置的摄像头的视差来确定物体的位置。由于有需要采集两个摄像头的图像共同参与计算&#xff0c;所以双目相机装配要求…

【最佳牛围栏——二分】

题目 思路 扩大数据&#xff0c;避免精度问题&#xff0c;拉到整数域解决不用枚举前缀和的 l 和 r&#xff0c;改为求可能 l 的最小值&#xff0c;线性做法不用记录长度来求平均值&#xff0c;改为用平均值处理数据&#xff08;这是第二条的前提&#xff09;&#xff0c;直接通…

[java][高级]MyBatisPlus

一、MyBatisPlus简介 1. 入门案例 问题导入 MyBatisPlus环境搭建的步骤&#xff1f; 1.1 SpringBoot整合MyBatisPlus入门程序 ①&#xff1a;创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息 ②&#xff1a;选择当前模块需要使用的技术集&…

Shutdown Abort 强制关库,真的有可能起不来?

全文目录&#xff1a; 开篇语前言 &#x1f31f;目录 &#x1f4cb;1. 什么是 Shutdown Abort&#xff1f; &#x1f4a1;工作原理 &#x1f527; 2. Shutdown Abort 的潜在风险 ⚠️3. 真实案例分析 &#x1f4ca;案例背景 &#x1f310;分析与反思 &#x1f50d; 4. 如何降低…

win10/11无休眠设置和断电后电池模式自动休眠而不是睡眠-用以省电

1、打开休眠设置选项 打开控制面板\所有控制面板项\电源选项\ 左侧的选择电源按钮的功能 默认状态没有休眠 1、管理员权限打开cmd或者power shell 2、输入一下指令&#xff0c;打开休眠选项 powercfg -hibernate on关闭后重新打开 控制面板\所有控制面板项\电源选项\左侧的选…

PyQt5实战——多脚本集合包,UI以及工程布局(二)

个人博客&#xff1a;苏三有春的博客 系列往期&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; 布局 2.1 UI页面布局 整体框架分为分为三个部分&#xff0c;垂直分布。 第一个部分为功能选择按钮&#xff08;如UTF-8转换&#…

Linux驱动开发(3):字符设备驱动

上一章节我们了解到什么是内核模块&#xff0c;模块的加载卸载详细过程以及内核模块的使用等内容。 本章&#xff0c;我们将学习驱动相关的概念&#xff0c;理解字符设备驱动程序的基本框架&#xff0c;并从源码上分析字符设备驱动实现和管理。 主要内容有如下五点&#xff1a;…