是以下C ++单例实现?

时间:2010-11-15 02:53:21

标签: c++ singleton coding-style

我确实在网上看到了一些实现单例类的模式如下:

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上编译,但我觉得将实例命名为类的名称并不是一种正确的编码方式。

  • 是否有任何禁止此类约定的特殊规则(实例名称与类名相同)
  • 源代码是否在其他编译器中编译?

4 个答案:

答案 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来说,将FalseTrue值描述为bool类型的单例并不罕见。有时人们需要单身(或单身),同时仍允许任意实例化。

在C ++中,实现单例的一种特别简单的方法称为Meyers' Singleton。实际上,单例实例是函数中的一个静态变量,它提供对它的访问。这通常与禁止该类的一般实例化相结合,例如,由构造函数或所有构造函数private和单例访问函数构成static成员函数。

干杯&amp;第h。,

答案 2 :(得分:3)

如果你必须求助于全局状态,单个常量全局变量的主要优点是延迟加载...也就是说,在调用GetInstance()之前不会实例化单例对象第一次。

我不喜欢这个实现,因为它不支持延迟加载,而且这与缺少单个实例约束(正如John指出的那样)一样,都无法实现其目的。

答案 3 :(得分:3)

以这种方式隐藏名称绝对不是一个好主意。您只会混淆将看到此代码的人。 Wikipedia page for Singleton包含不同语言的实现。你应该看看。并特别介绍了缺点部分。正如John Dibling指出的那样,这不是一个真正的单身人士。