单例的命名重复

        最近在开发的过程中,涉及到多个目录下,都由相同文件名和类名的单例,但是调用的时候编译器却知道调用哪个,所以学习了下,做个笔记。

DataInteraction *DataInteraction::instance()
{static DataInteraction instance;return &instance;
}

        这段代码是一个实现单例模式的函数,旨在保证一个类只有一个实例,并提供一个全局访问点。这个函数返回一个指向静态局部变量`instance`的指针。无论在多少个不同的源文件中调用这个函数,只要这些源文件链接到同一个可执行文件中,并且`DataInteraction`类的定义是相同的,这个函数将始终返回相同对象的地址。

        然而,如果在不同的目录下有相同的这段代码,并且它们被编译成不同的库或者可执行文件,每个库或可执行文件将拥有其自己的`DataInteraction`实例。换句话说,每个动态链接库(DLL)或者每个可执行文件将拥有自己的`instance`静态局部变量。在这种情况下,不同的库或可执行文件之间的`DataInteraction`实例是独立的,并且不会混淆。

         简单来说,如果在不同的子目录下创建了相同名字的文件`DataInteraction.cpp`和`DataInteraction.h`,并且这些文件中都包含了相同的单例实现代码,那么每个子目录中的`DataInteraction`都会成为各自子目录的局部单例。当在其他地方引入这些头文件时,实际上在使用相应子目录下的`DataInteraction`单例。

        如果创建了多个这样的单例,每个单例都会在系统中存在一个实例。换句话说,每个单例的作用域仅限于创建它的子目录及其包含的源文件,不同子目录下的单例互不干扰,且系统中可能存在多个不同的`DataInteraction`实例。

        系统在链接时会根据文件路径或命名空间来区分不同的实体。假设有以下结构:

Directory1/DataInteraction.cppDataInteraction.h
Directory2/DataInteraction.cppDataInteraction.h

        在这种情况下,编译器会将每个`DataInteraction.cpp`编译为一个对象文件,并将其与相应的头文件一起编译。然后链接器将这些对象文件合并为一个可执行文件或库。由于文件位于不同的目录中,链接器能够区分它们,并且在链接时为每个目录创建相应的符号表。因此,当在其他地方引入`DataInteraction.h`时,编译器会根据当前上下文来选择相应目录下的实现。

如果在不同的目录中有相同名字的文件,并且它们被编译为不同的库,那么链接器将会将这些库中的符号分别保留,并且在链接时根据需要选择正确的符号。这样,系统就能够区分不同目录下的实例,并且不会混淆它们。

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

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

相关文章

单单单单单の刁队列

在数据结构的学习中,队列是一种常用的线性数据结构,它遵循先进先出(FIFO)的原则。而单调队列是队列的一种变体,它在特定条件下保证了队列中的元素具有某种单调性质,例如单调递增或单调递减。单调队列在处理…

游戏辅助 -- 三种分析角色坐标方法(CE、xdbg、龙龙遍历工具)

所用工具下载地址: https://pan.quark.cn/s/d54e7cdc55e6 在上次课程中,我们成功获取了人物对象的基址:[[[0xd75db8]1C]28],而人物血量的地址则是基址再加上偏移量278。 接下来,我们需要执行以下步骤来进一步操作&a…

新版security demo(二)前端

写这篇博客,刚好换了台电脑,那就借着这个demo复习下VUE环境的搭建。 一、前端项目搭建 1、安装node 官网下载安装即可。 2、安装脚手架 npm install -g vue-cli 使用脚手架搭建一个demo前端项目 vue init webpack 项目名称 3、安装依赖 这里安装…

产品管理 | 产品文档模板

文章目录 环素 - 尿素订单管理系统功能需求(一)首页1.概述2.原型地址3.原型图及说明4.明细需求描述(1)新建订单 环素 - 尿素订单管理系统功能需求 (一)首页 1.概述 环素是一种集成的商品订单管理方案&am…

【OpenHarmony 实战开发】 做一个 loading加载动画

本篇文章介绍了如何实现一个简单的 loading 加载动画,并且在文末提供了一个 demo 工程供读者下载学习。作为一个 OpenHarmony 南向开发者,接触北向应用开发并不多。北向开发 ArkUI 老是改来改去,对笔者这样的入门选手来说学习成本其实非常大&…

【每日力扣】98. 验证二叉搜索树 与 108. 将有序数组转换为二叉搜索树

🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害 98. 验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&a…

【C++】适配器模式

文章目录 前言 1. 适配器的介绍2. 仿函数2.1 sort函数的模板参数2.2 priority_queue类的模板参数 3. priority_queue模拟实现3. stack & queue 模拟实现3.1 deque的介绍3.2 deque的优点与缺陷3.3 STL标准库中对于stack和queue的模拟实现 前言 C中的适配器是一种设计模式&am…

物联网实战--平台篇之(四)账户后台交互

目录 一、交互逻辑 二、请求验证码 三、帐号注册 四、帐号/验证码登录 五、重置密码 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631…

给定两个点坐标和半径,求圆心位置

给定两个点坐标和半径,求圆心位置 引言正文结论举例引言 今天在做项目的时候遇到了一个问题,当给定两个点 A = ( x 1 , y 1 ) A=\left ( x_1, y_1 \right )

线程安全的概念及原因

1.观察线程不安全 public class ThreadDemo {static class Counter {public int count 0;void increase() {count;}}public static void main(String[] args) throws InterruptedException {final Counter counter new Counter();Thread t1 new Thread(() -> {for (int …

Docker安装记录

老是报错 “Error response from daemon: Get “https://registry-1.docker.io/v2/”: proxyconnect tcp: dial tcp 127.0.0.1:7890: connect: connection refused” ,不知道是什么原因,卸载了重装一下。 彻底卸载 sudo apt-get purge docker-ce docke…

进一步分析并彻底解决 Flink container exit 143 问题

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益: 了解大厂经验拥有和大厂相匹配的技术等 希望看什么,评论或者私信告诉我! 文章目录 一…

Java并发编程之锁的艺术:面试与实战指南(三)

Java并发编程之锁的艺术:面试与实战指南(三) 文章目录 Java并发编程之锁的艺术:面试与实战指南(三)前言十七、Java中线程和进程的区别是什么?十八、什么是Java内存模型(JMM&#xff…

AlibabaCloud微服务下的链路追踪系统实战详解

🚀 作者 :“二当家-小D” 🚀 博主简介:⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人,8年开发架构经验,精通java,擅长分布式高并发架构,自动化压力测试,微服务容器化k…

如何利用AI技术提升内容生产的效率和质量

目录 前言1 自动化内容生成1.1 文章生成1.2 视频制作1.3 音频合成 2 内容分发与推广2.1 智能内容推荐2.2 社交媒体管理 3 内容分析与优化3.1 用户反馈分析3.2 内容效果评估 结语 前言 在当今数字化时代,人工智能(AI)技术对内容生产、分发和优…

Django框架之Ajax基础

一、JSON知识回顾 1、什么是JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,通常用于在网络之间传输数据。它基于JavaScript的语法,但是独立于编程语言,因此几乎所有编程语言都支持解析和生成JSO…

2024第六届济南国际大健康产业博会将于5月27日如期开幕

由山东省城市经济学会、山东省科学养生协会主办的第六届中国(济南)国际大健康产业博览会,将于5月27-29日,在济南黄河国际会展中心盛大举办。 近年来,健康越来越受到大众的重视,在我国经济重要的转型阶段成…

Java Closeable 和 AutoCloseable接口

AutoCloseable & Closeable Closeable和AutoCloseable都是接口,且都只定义了一个close()方法。 Closeable: 定义于 java.io包中,于JDK5添加; AutoCloseable: 定义于java.lang包中, 于JDK7添加; AutoCloseable.java package java.lang…

AI 编程在哪些场景能够提高效率?

AI 编程在许多场景都能提高效率,其中一些主要场景包括: 1、自动化任务: AI 编程可以用于自动化重复性任务,如数据清洗、数据转换、文件处理等。通过机器学习和自然语言处理等技术,可以让计算机自动执行这些任务&#…

MFC实现点击列表头进行排序

MFC实现点击列表头排序 1、添加消息处理函数 在列表窗口右键,类向导。选择 IDC_LIST1(我的列表控件的ID),消息选择LVN_COLUMNCLICK。 2、消息映射如下 然后会在 cpp 文件中生成以下函数 void CFLashSearchDlg::OnLvnColumnclic…