代码之家  ›  专栏  ›  技术社区  ›  AndersK

如何在C++中编码乔恩?斯基特的Singleton?

  •  14
  • AndersK  · 技术社区  · 15 年前

    论乔恩 site 他在C有一个非常优雅的设计,看起来像这样:

    public sealed class Singleton
    {
        Singleton()
        {
        }
    
        public static Singleton Instance
        {
            get
            {
                return Nested.instance;
            }
        }
    
        class Nested
        {
            // Explicit static constructor to tell C# compiler
            // not to mark type as beforefieldinit
            static Nested()
            {
            }
    
            internal static readonly Singleton instance = new Singleton();
        }
    }
    

    我想知道如何在C++中编写等价的代码?我有这个,但我不确定它是否真的有相同的功能,从乔恩。(顺便说一句,这只是周五的练习,不需要任何特别的练习)。

    class Nested;
    
    class Singleton
    {
    public:
      Singleton() {;}
      static Singleton& Instance() { return Nested::instance(); }
    
      class Nested
      { 
      public:
        Nested() {;}
        static Singleton& instance() { static Singleton inst; return inst; }
      };
    };
    
    ...
    
    
    Singleton S = Singleton::Instance();
    
    4 回复  |  直到 15 年前
        1
  •  34
  •   luke    15 年前

    这项技术是由马里兰大学计算机科学研究员Bill Pugh介绍的,长期以来一直在Java界使用。我想我在这里看到的是比尔原始Java实现的C变体。它在C++上下文中没有意义,因为当前C++标准对并行性是不可知的。整个想法是基于语言的保证,即内部类只能在第一次使用时以线程安全的方式加载。这不适用于C++。(另见 Wikipedia 条目)

        2
  •  9
  •   navigator    15 年前

    本文将讨论如何实现单例,以及c++中的线程安全性。

    http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf

        3
  •  1
  •   ConcernedOfTunbridgeWells    15 年前

    据我所知,可继承的单例行为在c++或java中是不可能的(至少在jdk的早期版本中是不可能的)。这是一个特殊的把戏。你的子类必须显式地实现协议。

        4
  •  1
  •   Community M-A    7 年前

    超过你想知道的关于C++中的Sigelton

    C++ Singleton design pattern

    有关线程特定问题,请参见此处:

    Singleton instance declared as static variable of GetInstance method