我确实在网上看到了一些实现单例类的模式如下:
class singleton {
public:
int a;
void print()
{
std::cout << a << std::endl;
}
} singleton;
int main()
{
// singleton b; COMPILATION ERROR
singleton.a = 3;
singleton.print();
return 0;
}
它确实在GCC上编译,但我觉得将实例命名为类的名称并不是一种正确的编码方式。
答案 0 :(得分:7)
class singleton ss;
你可以构建不止一个,所以这不是一个单身人士。隐藏的名字可以说是邪恶的。单身人员很糟糕,所以不要使用它们。
答案 1 :(得分:5)
关于你真正要问的两个问题,
是的,C ++有相同范围共存的不同类型名称的概念,如C和
是的,当包含相应的标题时,代码可以使用MinGW g ++ 4.4.1,Visual C ++ 10.0和Comeau Online 4.3.10.1进行编译。
当您对某些代码段是否符合标准时有疑问时,实际上只需将其提交给Comeau Online。
然而,代码在技术上是好的并不意味着它可以......: - )
Singleton 用于描述与全局变量不同的内容。你拥有的是一个全局变量。因此,它不是单身人士。
单身人士的两个基本属性是
有全局唯一的实例,
该实例是按需创建的。
通常人们希望类似与全局变量相似但更受控制。一个人想要一个更受控制的实例化顺序,懒惰的创建有助于此。并且想要限制允许的实例数量,通常是
后者是使用单身人士的常见原因,例如Wikipedia's article on singletons将单例描述为“将类的实例化限制为一个对象”。但这是一种简单化的观点。有时需要一个特定数量的实例,作为单身人士。例如,对于Python来说,将False
和True
值描述为bool
类型的单例并不罕见。有时人们需要单身(或单身),同时仍允许任意实例化。
在C ++中,实现单例的一种特别简单的方法称为Meyers' Singleton。实际上,单例实例是函数中的一个静态变量,它提供对它的访问。这通常与禁止该类的一般实例化相结合,例如,由构造函数或所有构造函数private
和单例访问函数构成static
成员函数。
干杯&amp;第h。,
答案 2 :(得分:3)
如果你必须求助于全局状态,单个常量全局变量的主要优点是延迟加载...也就是说,在调用GetInstance()之前不会实例化单例对象第一次。
我不喜欢这个实现,因为它不支持延迟加载,而且这与缺少单个实例约束(正如John指出的那样)一样,都无法实现其目的。
答案 3 :(得分:3)
以这种方式隐藏名称绝对不是一个好主意。您只会混淆将看到此代码的人。 Wikipedia page for Singleton包含不同语言的实现。你应该看看。并特别介绍了缺点部分。正如John Dibling指出的那样,这不是一个真正的单身人士。