- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在开发一个包含多个类的 C++ 项目,这些类必须是单例,它们之间存在依赖关系(初始化顺序很重要)。
我想出了这个解决方案:
class MySingleton1
{
protected:
MySingleton1();
}
#include "MySingleton1.hpp"
#include "MySingleton2.hpp"
class Singletons : public MySingleton1, public MySingleton2 {}
static Singletons s_singletons;
template<>
MySingleton1& getSingleton()
{
return s_singletons;
}
template<>
MySingleton2& getSingleton()
{
return s_singletons;
}
template <class TSingleton>
TSingleton& getSingleton();
优点:
低耦合:
初始化顺序可以通过改变单例类的继承顺序来控制
缺点:
因此,据我所知,这实际上相当不错所以我想就此打住,但我征求您的反馈 (还有什么比编程社区更好的地方呢?)。
您认为此解决方案有哪些额外优势/劣势?
您有什么替代方案建议?
最佳答案
这会迫使单例集中化,这会扰乱更复杂项目中的依赖关系。具有 singleton.cpp
的库必须依赖于每个单例所需的一切。同时,任何使用单例的人都必须依赖于singleton.cpp
库。
基本上,您的代码只能在单一的非模块化项目中运行。将其扩展到多个动态库几乎是不可能的。
您的初始化顺序必须手动维护。
静态全局变量的构造点与 main
中第一个表达式之前的所有内容都是无序的。
我使用的一个不错的解决方案是创建一个动态库来保存单例内存。
要成为单例,您需要继承 CRTP 助手,它提供了一个 ::Instance()
内联方法。想要单例的人使用 ::Instance()
。
::Instance()
创建一个静态局部变量生命周期 token 。然后它会尝试从主 DLL 中获取单例的存储空间;如果对象已经创建,它只是将存储转换为对象类型,并增加其引用计数。
如果没有,它会创建新的存储并在其中构造对象。
在销毁静态局部变量生存期标记时,它减少了引用计数。如果该引用计数达到 0,它会在当前动态库中本地销毁它。
单例的生命周期现在是 ::Instance()
创建变量的生命周期的 union 。销毁发生在非类型删除代码中,因此我们不必担心代码被卸载的 DLL。存储是核心。存储存储的 DLL 必须低于 Singleton 系统的每个用户级别,但它又没有依赖关系,所以这不是一件痛苦的事。
这远非完美;单例和生命周期是一个持续存在的问题,因为干净的程序关闭是困难的,并且由于单例的存在而变得更加困难。但到目前为止,它在一个相当大的项目中一直有效。
关于C++ 单例 : how good is this solution? 优点/缺点,替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53783561/
我正在使用 pytesseract(tesseract 版本 3.05)对以数字方式创建的打印 PDF 帐单进行 OCR(光学字符识别)。我对其进行预处理以去除任何颜色并将其设置为纯黑白和 600 D
以下是我尝试运行的代码,输出是Good。那么,我们可以使用类实现的接口(interface)的变量吗? interface IDummyInterface { public String TY
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在编写一个 Java 客户端,它通过 HTTP/XML 与远程服务器通信。 服务器以 XML 格式向我的客户端发送命令,如下所示: C1 ..... 大约有 10 个或更多不同的命令(C1
我在 android 应用程序上有一个奇怪的问题,我没有这样的表异常,但我确定数据库存在。对于某些将我重定向到此处其他帖子的人,我想补充一点,我正在自己的手机上尝试该应用程序而不是模拟器,这是因为我在
我在谷歌上搜索 RNGCryptoServiceProvider,其中包含有关如何限制最大值和最小值之间的范围并仍然获得均匀分布的示例。在我使用模运算符之前,但有时我会得到奇怪的值(高于最大值)...
这个问题在这里已经有了答案: calling constructor of a class member in constructor (5 个答案) 关闭 4 年前。 我有一个非指针类成员需要在构
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭10
作为hadoop配置什么好.. 大量小型机器,每台具有 512 MB Ram 或少量大型机器(大约 2Gb 或 4GB Ram) 我可以选择两者中的任何一个,因为我的节点是虚拟机.. 请分享您的想法.
伙计们,我是vue新手所以不知道如何实现以下情况我如何获取当前选定行的数据这是代码
我经常访问一个名为 GOOD 的网站我特别喜欢一种审美风格;导航栏如何在网站背景中扩展其颜色。如果您访问该网站,就会明白我的意思。 在 CSS 中,我怎样才能以最简单的方式复制它?我已经用 z-ind
我有一个存在主义假设,例如: H : exists (a : A) (b : B) (c : C), P a b c 我想分解为: a : A b : B c : C H0 : P a b c 战术d
在 Github 上,我注意到一些拉取请求说它们“适合合并”,因为它们通过了 Travis构建通过。我已经使用了一点 Travis,它如何与 Github 上的拉取请求集成? 这是我正在谈论的内容的屏
刚刚在 Apple docs: 中找到 Note: Although good for occasional communication between threads, you should not
我正处于一个应用程序的概念阶段,该应用程序将有大量音频/视频输入和输出。我想用Java来做;但不知何故我还没有完全相信。你怎么认为?到底能有多糟糕?有什么建议吗? 为什么我想到 Java: 这是我最熟
我正在用 Java 重新实现 .Net API,该 API 指定了一大堆事件,但 java 并不隐式支持。 我将使用观察者模式,但由于事件的数量,我真的不想让界面变得困惑。 我想知道声明一个“Even
我的类有很多方法,其中一些方法是用注释标记的。每个方法可以有很多注释,例如 @StepAnnotation(name="Action1" ) @SequenceAnnotation(name="tra
启用GD后(通过调用enableSecureCommunication或对应用程序进行身份验证),将自动保护NSURLConnection。它是如何做到的? 最佳答案 我的猜测是,Good Dynam
我是 Vue 的新手并且陷入了困境,如果有人建议我如何做到这一点,我不知道该怎么做,让我先展示我的代码 save 并在脚本中 data(){ return{
考虑以下代码: private List types; if(!getTest().contains(type)) { return Color.LIGHT_GRAY;
我是一名优秀的程序员,十分优秀!