单例初始化

时间:2011-04-12 13:54:01

标签: c++ singleton private-members

我在代码中实现了Singleton design pattern

假设它是:

class Singleton
{
  Singleton () {}
  static Singleton* s;
public:
  static Singleton* Get () {
    if (!s)
      s = new Singleton ();
    return s;
  }
};

令我困惑的是这种模式的“初始化”。 在.cpp中我把:

SingletonPointer* SingletonClass::s (0);

但我不明白如何访问定义s,因为它是private。 怎么可能?

TIA, JIR

5 个答案:

答案 0 :(得分:9)

使用Singleton模式的最佳方法是根本不使用它。

简要总结单身人士为何不好:

  1. 它们是具有特殊限制的全局变量。由于他们自己的原因,全球足够糟糕;让他们成为单身只是放大了坏事。
  2. 如果你真的只需要一个对象的一个​​实例,那就做一个。如果您需要一个特殊的设备来确保您不会生成多个设备,那么代码的语义就会出现问题。使它成为一个单身并不能解决这个问题,它只是用新的问题来论证它。
  3. 单身人士不喜欢线程。线程很难。不要让它们变得更难。
  4. 使用Singleton不会解决任何问题。它只是将错误的语义应用于现有代码,使得该代码的未来扩展变得困难或不可能(如果明天你需要两个?),并添加新的问题。长话短说,就是不要使用它们。

答案 1 :(得分:5)

静态字段除声明外还必须有定义。声明通常在.h文件中的类声明中,而定义几乎总是在.cpp文件中。静态变量的定义是必须的,因为它们必须初始化为某种东西。

但即使定义在类体之外,甚至在完全不同的文件中,也并不意味着它不是类的一部分。 SingletonClass::使它成为类定义的一部分(而不是类声明),因此它可以“访问”私有字段。

对于在类体外部定义的方法也是如此,例如:

// A.h
class A
{
private:
    int b;
public:
    A(int x) : b(x)
    {}

    Do();
}

// A.cpp
A::Do()
{
    return b;
}

答案 2 :(得分:2)

在初始化代码中,您不是访问 Singleton::s,而是定义

答案 3 :(得分:1)

私有变量可以通过类的所有方法访问。您访问 s 变量的唯一位置是方法 Get(),它属于同一个类。

如果你想从外面访问 s ,你不能直接访问它,但是你必须调用 Get()方法(这是公共的)并且该方法实际上将为您返回 s

用法:

Singleton * s = SingletonClass::Get();

答案 4 :(得分:0)

可以通过Get从外部访问(如果您指定了相应的类型)。它是private的事实不会阻止该方法返回指向它的指针。正在private的成员只能阻止按名称​​按 访问它。