2009-10-30 2 views
14

На Джоне site он thisvery элегантного дизайна одиночки в C#, который выглядит следующим образом:Как написать синглтон Jon Skeet в 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(); 
+0

не должен физические упражнения будут размещены Я не знаю, понедельник? Почему в пятницу? Я бы подумал, что людям есть чем заняться в выходные, кроме как больше работы

+4

Вы ищете родной язык C++ или C++/CLI? Я считаю, что правила инициализации типа совершенно разные для родного C++, поэтому я не ожидал, что тот же трюк будет работать. Только для записи это была не моя собственная идея - она ​​была ущипнута от кого-то еще, хотя я не могу вспомнить, кто: –

+0

вы также можете спрятать операторы конструктора, деструктора, копирования и присваивания. – hplbsh

ответ

34

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

+0

благодарит за информацию! –

1

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

+0

Я что-то упустил? Я не думаю, что наследование входит в изображение даже на примере C#. –

+0

Это определенно будет работать на Java - вот откуда я изначально получил эту идею. –

+0

Возможно, я что-то пропустил, ОП произвел впечатление, что он был после родового поведения.Я помню, как пытался создать наследуемый синглтон в раннем JDK и выяснил, что Java не может этого сделать; IIRC trad C++ тоже не будет, хотя вы, вероятно, можете сделать это с помощью шаблонов. Теперь я снова смотрю на статью, о которой конкретно не упоминается, поэтому, возможно, он просто смотрит, как реализовать Singeton. В книге GOF может быть пример на C++. – ConcernedOfTunbridgeWells

9

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

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

+0

+1 за упоминание этой очень хорошей статьи по теме Мейерса и Александреску. – sbi

+0

Alexandrescu также имеет целую главу об осуществлении синглетов в своей книге «Современный дизайн C++». Содержимое, вероятно, похоже. – luke

Смежные вопросы