Как кодировать синглтон Джона Скита в C ++? - PullRequest
14 голосов
/ 30 октября 2009

На сайте Джона он имеет очень элегантный синглтон в 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();

Ответы [ 3 ]

34 голосов
/ 30 октября 2009

Этот метод был введен исследователем информатики Университета Мэриленда Биллом Пью и долгое время использовался в кругах Java. Я думаю, что я вижу здесь вариант C # оригинальной реализации Java Билла. Это не имеет смысла в контексте C ++, поскольку текущий стандарт C ++ не зависит от параллелизма. Вся идея основана на языковой гарантии того, что внутренний класс будет загружен только в момент первого использования потокобезопасным способом. Это не относится к C ++. (Также смотрите эту Википедию запись)

9 голосов
/ 30 октября 2009

В этой статье вы найдете отличное обсуждение того, как реализовать синглтон, а также безопасность потоков в C ++.

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

1 голос
/ 30 октября 2009

Насколько я знаю, наследуемое поведение Singleton невозможно в C ++ или Java (или, по крайней мере, в более ранних версиях JDK). Это специфический трюк на C #. Ваши подклассы должны будут явно реализовать протокол.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...