我在代码中实现了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
答案 0 :(得分:9)
使用Singleton模式的最佳方法是根本不使用它。
简要总结单身人士为何不好:
使用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
的成员只能阻止按名称按 访问它。