C++怎么避免单例

发布时间:2021-11-24 16:41:50 作者:iii
来源:亿速云 阅读:170

这篇文章主要讲解了“C++怎么避免单例”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++怎么避免单例”吧!

I.3: Avoid singletons(避免单例)

Reason(原因)

Singletons are basically complicated global objects in disguise.

单例基本上就是一个复杂的全局对象的伪装。

Example(示例)

class Singleton {    // ... lots of stuff to ensure that only one Singleton object is created,    // that it is initialized properly, etc.};

There are many variants of the singleton idea. That's part of the problem.
存在许多单例想法的版本。这是问题的一个方面。

Note(注意)

If you don't want a global object to change, declare it const or constexpr.

如果你不希望全局对象发生改变,将其定义为常量或常量表达式。

Exception(例外)

You can use the simplest "singleton" (so simple that it is often not considered a singleton) to get initialization on first use, if any:

你可以使用最简单的“单例”(简单到经常不被认为是单例)以便在第一次使用时获取初始值。

X& myX(){    static X my_x {3};    return my_x;}

这是解决初始化顺序相关问题的最有效手段。在多线程环境中,静态对象的的初始化不会触发竞争条件(除非你不小心在某个共享对象的构造函数中访问了它)

译者注:这也是目前单例设计模式在现代C++中最新实现。

注意局部的静态变量不包含竞争条件。然而,如果X的析构动作牵涉到需要被同步的操作,我们必须使用一个次简单的解决方案。例如:

X& myX(){    static auto p = new X {3};    return *p;  // potential leak}

Now someone must delete that object in some suitably thread-safe way. That's error-prone, so we don't use that technique unless

现在某个角色必须以一种合适的线程安全的方式删除那个对象。由于容易引发错误,因此我们不会使用这个技术,除非

译者注:函数内部构建的静态对象在程序退出时会被自动析构,如果希望自己控制析构的时机就只能动态构建对象以避开自动析构。

If you, as many do, define a singleton as a class for which only one object is created, functions like myX are not singletons, and this useful technique is not an exception to the no-singleton rule.

如果你像很多人一样为只创建一个的对象定义单例类,像myX那样的函数没有使用单例,这个有用的技术也不是禁止单例规格的例外。

译者注:做个做法不是单例,也就不会违反禁止单例的规则。

Enforcement(实施建议)

Very hard in general.

通常会十分困难。

感谢各位的阅读,以上就是“C++怎么避免单例”的内容了,经过本文的学习后,相信大家对C++怎么避免单例这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. 单例的实现方式
  2. 单例 (补充) 创建单例的三种方式

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++

上一篇:MySQL主从复制怎样实现高可用

下一篇:raspberry pi代码如何实现人脸识别开锁应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》