在Jon的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 ++中编写等效代码?我有这个,但我不确定它是否实际上具有与Jon相同的功能。 (顺便说一句,这只是一个星期五的练习,不需要任何特别的东西)。
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 :(得分:34)
这项技术是由马里兰大学计算机科学研究员Bill Pugh引入的,并且已经在Java圈子中使用了很长时间。我认为我在这里看到的是Bill的原始Java实现的C#变体。它在C ++上下文中没有意义,因为当前的C ++标准对并行性是不可知的。整个想法基于语言保证,即内部类将仅以第一次使用的实例加载,以线程安全的方式加载。这不适用于C ++。 (另请参阅此Wikipedia条目)
答案 1 :(得分:9)
本文将对C ++中如何实现单例以及线程安全性进行深入讨论。
答案 2 :(得分:1)
据我所知,C ++或Java中无法实现可继承的Singleton行为(或者至少它不是早期版本的JDK)。这是一个C#特有的技巧。你的子类必须明确地实现协议。