多个单例实例

2023-12-31

我正在编写一个实用程序类库,其中许多都是单例。我已经使用继承来实现它们:

template <class T>
class Singleton {
    public:
        T& getInstance() {
            if(m_instance == 0) {
                 m_instance = new T;
            }

            return m_instance;
        }
    private:
        static T* m_instance;
};

class SomeClass : public Singleton<SomeClass> {
    public:
        SomeClass() {}
        virtual ~SomeClass() {}

        void doSomething() {;}
};

显然这是一个简单的例子,而不是一个实际的类。无论如何,我发现使用如下代码:

SomeClass::getInstance().doSomething();

将创建多个 SomeClass 实例。我认为这可能是因为它在我的库(.a)文件之外以及内部使用。例如,我正在使用一个不是我自己编写的 UI 库,它是单独编译的,并且我正在对其进行添加。其中一些添加使用了单例,这些单例也在我的 .a 库中使用。

是单独编译造成的吗?还有别的事吗?

我设法解决这个问题的唯一方法是在我的 main.cpp 文件中创建一个全局对象,我用我需要的任何单例来初始化它。然后所有代码都通过以下调用访问这个公共全局对象:

GlobalObject::getSomeClass().doSomething()

我讨厌每次创建另一个单例时都必须向该对象添加额外的方法。另外,使用第一种访问方法,语法似乎更清晰、更熟悉:

SomeClass::getInstance().doSomething();

如果您有任何想法、意见等,请告诉我。

Thanks.


您的问题是您的模板将在多个编译单元中实例化,因为它是完全内联的。因此,在每个使用模板的编译单元中,您最终将创建一个单例(每个编译单元)。您需要的是强制全局链接,以便所有编译单元引用相同的模板实例化。即将推出的 C++ 标准将通过以下方式支持此功能外部模板 http://en.wikipedia.org/wiki/C++0x#Extern_template。您现在可以做的是在项目中禁用自动实例化并手动实例化您显式使用的模板。这样,当您在任何编译单元中使用模板时,您将生成对实现的未知引用,然后可以由进行显式实例化的(一个)编译单元中的链接器来满足该引用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个单例实例 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 按成员序列化

    我已经实现了template
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • 重载<<的返回值

    include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex

随机推荐

  • CSS 宽度和高度属性的最大像素值是多少?

    最大有效值是多少pxCSS 的值width and height属性接受吗 我目前正在构建一个网络应用程序 它创建一个非常大的可缩放容器元素 我想知道实际的限制是什么 在元素上使用某些浏览器附带的 CSS 检查器10000000000px
  • 从 javascript 运行 bat 文件

    我正在尝试使用 javascript 运行 bat 文件 我尝试过使用 powershell 但它似乎无法正常工作 这是我尝试过的代码 var oShell WScript CreateObject WScript Shell oShell
  • 将浮动栏添加到滚动视图,就像 Facebook iOS 应用程序的时间线中一样

    我一直在尝试向我的测试项目添加不同的交互 但在添加 Facebook 的帖子状态栏之类的东西时遇到了麻烦 该状态栏位于时间线滚动视图上 并在向下滚动时随滚动视图一起滚动视图 但当您向上滚动时仍停留在导航栏下方 我一直在创建一个单独的 UIV
  • 如何在 docker 上运行电子应用程序

    我创建了一个托管电子应用程序的存储库的分支 该应用程序是一个聊天客户端 https github com Serkan devel BetterDiscordApp docker https github com Serkan devel
  • 是否可以克隆 ValueType?

    当已知对象是装箱 ValueType 时 是否可以克隆对象 而无需编写特定于类型的克隆代码 一些代码供参考 List
  • 如何从 statsmodels 中检索模型估计值?

    从这样的数据集 import pandas as pd import numpy as np import statsmodels api as sm A dataframe with two variables np random see
  • 如何使我的代码诊断语法节点操作对关闭的文件起作用?

    我正在使用 Roslyn 在 VS2015 预览版中 构建一组代码诊断 理想情况下 我希望它们产生的任何错误都充当持久错误 就像我违反了正常的语言规则一样 有很多选择 但我很难让其中任何一个都能持续工作 我已经成功实现了一个基本的语法节点操
  • WP7 XNA游戏:如何适应不同手机分辨率?

    我创建了一款针对 800 x 480 分辨率的游戏 但对其适应其他 WP7 分辨率很感兴趣 另外 我听说游戏可以通过 Mono 和 ExEn 移植到 iPhone 和 Android 从而开放大量其他屏幕分辨率 处理这个问题的正确方法是什么
  • Linux - 在 Nouveau 驱动程序上运行 Android 模拟器

    Linux Debian Sid x64 内核 4 14 Nvidia GPU 我无法在开放的 Nouveau 驱动程序上运行 Android 模拟器 我没有可以发布任何错误消息 只是分段错误 当我选择软件渲染时 它可以工作但无法使用 运行
  • 返回接口的函数

    为什么我可以说 CreateLion 的结果 指向实现 Cat 接口的结构的指针 是 Cat 接口的实例 但我不能说 CreateLion 是 返回 Cat 的函数 类型界面 实现此类行为的标准 Golang 方法是什么 package m
  • 如何向 JAXB 中的文本元素添加属性?

    如何使用 JAXB 生成以下 XML 片段
  • Codeigniter 图片和源 URL

    我的 Codeigniter URL 有问题 我有一个控制器 welcome php
  • 如何从数组末尾删除第 n 个元素

    我知道您可以使用 array pop 删除数组中的最后一个元素 但如果我想删除最后 2 或 3 个 我该怎么办 那么如何删除该数组中的最后 2 个元素呢 Use 数组拼接 http www php net array splice并指定要删
  • 测试给定数组是否是子数组

    这是 Numpy 初学者提出的一个基本问题 我有一个 5 行 2 列的 2D 数组 您可以将其视为 10 个 2d 向量 我想测试给定的向量是否在表内 例如 gt gt gt tableau array range 10 dtype uin
  • 自定义 Google Maps API v3 中的默认 InfoWindow

    我想知道是否可以自定义当用户单击 Google 在其默认地图上显示的各种企业时弹出的默认信息窗口 请参阅 screenie 我想添加功能 让人们在浏览地图时偶然发现这些位置时 固定 这些位置 目前无法监听 POI 图标上的任何点击事件 因此
  • 在泛型中实现算术?

    是否可以像您一样在 C 泛型中实现基本算术 至少是加法 使用 C 模板 http nonchalantlytyped net blog 2010 04 24 church numerals in c 我已经尝试了一段时间让它们启动并工作 但
  • 类型错误:预期的字节字符串值序列,找到 str 类型的值

    我正在尝试使用运行一个简单的 hello world 应用程序mod wsgi对于 Python 3 我使用的是 Fedora 23 这是我的 Apache 虚拟主机配置
  • 使用 Visual Studio 安装项目自动注册和 GAC COM Interop DLL

    我已经为 COM 互操作创建了一个 NET 程序集 它在我的开发计算机上运行良好 我目前正在尝试弄清楚如何使用 Visual Studio 的 安装项目 将 DLL 部署到目标计算机 如何使用 VIsual Studio 安装项目执行以下操
  • 如何在 matplotlib 中用日期时间绘制 ohlc 烛台?

    我需要每 5 分钟绘制一次交易数据 一根蜡烛 这是我到目前为止所拥有的 from matplotlib finance import candlestick2 ohlc fig ax plt subplots candlestick2 oh
  • 多个单例实例

    我正在编写一个实用程序类库 其中许多都是单例 我已经使用继承来实现它们 template