C++ 单例初始化
我在代码中实现了 假设是:C++ 单例初始化,c++,singleton,private-members,C++,Singleton,Private Members,我在代码中实现了 假设是: class Singleton { Singleton () {} static Singleton* s; public: static Singleton* Get () { if (!s) s = new Singleton (); return s; } }; 让我困惑的是这个模式的“初始化”。 在.cpp中,我放了: SingletonPointer* SingletonClass::s (0); 但我不明白如
class Singleton
{
Singleton () {}
static Singleton* s;
public:
static Singleton* Get () {
if (!s)
s = new Singleton ();
return s;
}
};
让我困惑的是这个模式的“初始化”。
在.cpp中,我放了:
SingletonPointer* SingletonClass::s (0);
但我不明白如何才能访问defines
,因为它是私有的
。
怎么可能呢
蒂亚,
Jir在初始化代码中,您没有访问
Singleton::s
,您正在定义它。在初始化代码中,您没有访问Singleton::s
,您正在定义它。它是通过Get
从外部访问的(如果您指定了适当的类型)。它是私有的这一事实并不妨碍该方法返回指向它的指针。私有的成员只会阻止通过名称访问它。它是通过Get
从外部访问的(如果您指定了适当的类型)。它是私有的这一事实并不妨碍该方法返回指向它的指针。私有成员只会阻止通过名称访问它。使用单例模式的最佳方法是根本不使用它
关于单身人士为何不好的简要概述:
使用单例不能解决任何问题。它只是将错误的语义应用于现有代码,使该代码的未来扩展变得困难或不可能(如果明天需要两个呢?),并添加新的问题。长话短说,就是不要使用它们。使用单例模式的最好方法是根本不使用它 关于单身人士为何不好的简要概述:
使用单例不能解决任何问题。它只是将错误的语义应用于现有代码,使该代码的未来扩展变得困难或不可能(如果明天需要两个呢?),并添加新的问题。长话短说,就是不要使用它们。一个类的所有方法都可以访问私有变量。访问s变量的唯一位置是属于同一类的Get()方法 如果要从外部访问s,不能直接访问,但必须调用Get()方法(它是公共的),该方法实际上会为您返回s 用法:
Singleton * s = SingletonClass::Get();
私有变量可以被一个类的所有方法访问。访问s变量的唯一位置是属于同一类的Get()方法 如果要从外部访问s,不能直接访问,但必须调用Get()方法(它是公共的),该方法实际上会为您返回s 用法:
Singleton * s = SingletonClass::Get();
除了声明之外,静态字段还必须有定义。声明通常放在.h文件的类声明中,而定义几乎总是放在.cpp文件中。静态变量的定义是必须的,因为它们必须初始化为某个对象 但是,即使定义在类主体之外,甚至在完全不同的文件中,也不意味着它不是类的一部分。
SingletonClass::
使其成为类定义的一部分(与类声明相反),因此它可以“访问”私有字段
在类主体之外定义的方法也是如此,例如:
// A.h
class A
{
private:
int b;
public:
A(int x) : b(x)
{}
Do();
}
// A.cpp
A::Do()
{
return b;
}
除了声明之外,静态字段还必须有定义。声明通常放在.h文件的类声明中,而定义几乎总是放在.cpp文件中。静态变量的定义是必须的,因为它们必须初始化为某个对象 但是,即使定义在类主体之外,甚至在完全不同的文件中,也不意味着它不是类的一部分。
SingletonClass::
使其成为类定义的一部分(与类声明相反),因此它可以“访问”私有字段
在类主体之外定义的方法也是如此,例如:
// A.h
class A
{
private:
int b;
public:
A(int x) : b(x)
{}
Do();
}
// A.cpp
A::Do()
{
return b;
}
为什么要从
void
函数返回值?;)哎呀!我想如果我复制n'pasted:D会更好谢谢你指出。我马上就来。为什么要从void
函数返回值?;)哎呀!我想如果我复制n'pasted:D会更好谢谢你指出。我马上去拿。重点是:这是关于定义,而不是访问。尽管如此,如果它是私有的,怎么可能在类之外定义它呢?要点是:它是关于定义的,而不是访问的。但是,如果它是私有的,那么如何在类之外定义它呢?现在很清楚了。谢谢你的解释。我没有想到我们在定义类方法时总是这样做。现在很清楚了。谢谢你的解释。我没有想到我们在定义类方法时总是这样做。@RedX:我对这样一篇文章很感兴趣,我知道很多缺点