Как закодировать Jon Skeet Singleton в С++?
На Jon сайт у него есть такой элегантно оформленный синглтон в С#, который выглядит так:
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();
}
}
Мне было интересно, как закодировать эквивалент в С++? У меня есть это, но я не уверен, имеет ли он на самом деле те же функции, что и у Джона. (Кстати, это всего лишь пятничное упражнение, не требуемое для чего-то конкретного).
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();
Ответы
Ответ 1
Этот метод был введен исследователем Университета Мэриленда по компьютерным наукам Биллом Пью и долгое время использовался в Java-кругах. Я думаю, что я вижу здесь вариант С# оригинальной реализации Java Билла. Это не имеет смысла в контексте С++, поскольку текущий стандарт С++ является агностиком на parallelism. Вся идея основана на языковой гарантии, что внутренний класс будет загружен только в случае первого использования в потокобезопасном режиме. Это не относится к С++. (Также см. Эту запись Wikipedia)
Ответ 2
Вы найдете отличное обсуждение того, как реализовать синглтон, а также безопасность потоков на С++ в этой статье.
http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
Ответ 3
Насколько мне известно, наследуемое поведение Singleton невозможно в С++ или Java (или, по крайней мере, это не было в более ранних версиях JDK). Это особый трюк на С#. Ваши подклассы должны будут явно реализовать протокол.
Ответ 4
Больше, чем вам хотелось узнать о singeltons в С++
С++ Singleton design pattern
Для конкретных проблем с резьбой см. здесь:
Экземпляр Singleton объявлен как статическая переменная метода GetInstance