关于c ++:Singleton初始化

Singleton initialization

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

假设是:

1
2
3
4
5
6
7
8
9
10
11
class Singleton
{
  Singleton () {}
  static Singleton* s;
public:
  static Singleton* Get () {
    if (!s)
      s = new Singleton ();
    return s;
  }
};

令我困惑的是这个模式的"初始化"。在.cpp中,我把:

1
SingletonPointer* SingletonClass::s (0);

但我不明白为什么可以accessdefine s,因为它是private。怎么可能?

蒂亚JIR


使用单例模式的最好方法是根本不使用它。

简单总结为什么单件商品不好:

百万千克1他们是有特殊限制的全球性组织。由于自身原因,全球的情况已经够糟糕了;让他们成为单身者只会加剧这种糟糕。百万千克1百万千克1如果您真的只需要对象的一个实例,那么就创建一个。如果您需要一个特殊的设备来确保您不制作多个,那么您的代码的语义就有问题。把它变成单件并不能解决问题,它只是用新问题来解决问题。百万千克1百万千克1单件衣服不适合穿线。螺纹足够硬。别让他们更难相处。百万千克1

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


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// A.h
class A
{
private:
    int b;
public:
    A(int x) : b(x)
    {}

    Do();
}

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


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


私有变量可以被类的所有方法访问。访问S变量的唯一位置是属于同一类的get()方法。

如果您想从外部访问s,则不能直接访问,但必须调用get()方法(它是公共的),而该方法实际上会为您返回s。

用法:

1
Singleton * s = SingletonClass::Get();

它可以从外部通过Get访问(如果您提供了适当的类型)。事实上,它是private并不妨碍该方法返回指向它的指针。一个成员是private只是阻止通过名字访问它。