1

我在我的代码中实现了单例设计模式。

假设它是:

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

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

SingletonPointer* SingletonClass::s (0);

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

蒂亚,吉尔

4

5 回答 5

8

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

单身人士为什么不好的简要总结:

  1. 它们是具有特殊限制的全局变量。出于自身原因,全球人已经够糟糕了;让他们单身只会放大坏处。
  2. 如果你真的只需要一个对象的实例,那就只做一个。如果您需要一种特殊的设备来确保您不会制作多个设备,那么您的代码语义就有问题。使它成为一个单例并不能解决问题,它只是用新的问题解决它。
  3. 单例不能很好地处理线程。线程已经够难了。不要让它们变得更难。

使用单例并不能解决任何问题。它只是将错误的语义应用于现有代码,使该代码的未来扩展变得困难或不可能(如果明天需要两个怎么办?),并增加了新问题。长话短说,只是不要使用它们。

于 2011-04-12T13:59:04.193 回答
5

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

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

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

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

    Do();
}

// A.cpp
A::Do()
{
    return b;
}
于 2011-04-12T14:06:37.693 回答
2

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

于 2011-04-12T13:55:36.787 回答
1

私有变量可以被类的所有方法访问。您访问s变量的唯一位置是在属于同一类的方法Get()中。

如果你想从外部访问s,你不能直接这样做,但你必须调用Get()方法(这是公共的),该方法实际上会为你返回s

用法:

Singleton * s = SingletonClass::Get();
于 2011-04-12T14:03:30.473 回答
0

它是从外部通过Get(如果你给它适当的类型)访问的。它的事实private并不能阻止该方法返回指向它的指针。一个成员只是阻止通过 nameprivate访问它。

于 2011-04-12T13:56:07.903 回答