How can I do some code work just like a singleton?
Possible Duplicate:
C++ Singleton design pattern.
如何在不使用单一实例的情况下,只创建一个类的实例并与所有头文件和源文件共享该实例?你能举个简单的例子吗?
- 呃,这不是很像一个单身汉的定义吗?
- "分享那个实例"是什么意思?还有家庭作业?
- 我知道这是单件的定义,但我需要知道是否还有其他方法可以做到这一点。当我说要共享实例时,我的意思是使用在所有源和头中创建的唯一的实例。我也想举个例子。谢谢您
- 也许"使用单例"意味着在类本身实现约束。
- 我不认为这是复制品;他似乎知道辛格尔顿,但他不想要。看来这不能解决他的问题。这就是为什么他在"不使用单例"的情况下提出解决方案的原因。
您可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Sample
{
/*** your code **/
public:
Sample();
void DoWork();
int GetValue();
/*** other functions ***/
};
Sample & OneInstance()
{
static Sample instance;
return instance;
}
//Use OneInstance everywhere like this
OneInstance().DoWork(); |
注:Sample不是单例函数,但您可以使用OneInstance()函数,就像它是Sample的一个相同实例一样,您可以在任何地方使用它!
您可以使用它来初始化一些全局变量,如下所示:
1
| int g_SomeValue= OneInstance().GetValue(); |
不能用Sample的全局static实例来完成。这是因为:
静态初始化顺序失败
- 问题是该示例允许任何人创建示例的实例。
- @何塞:没错。这就是不单身的意思。这不是问题所在。操作需要一个实例,他可以在整个程序中使用。他可能希望在其他上下文或情况中创建多个实例。他可能正面临着这样一种情况,他想创建这样一个类,或这样一个全球性的实例。我只是想帮助他,因为我不知道他到底在面对什么。也许,他根本不需要,或者他需要。谁知道呢。但我能做的,回答他的问题。也许,这会帮助他!
- 如果我让头中的类声明该类的全局实例为const,并在其他源和头中使用它,会怎么样??能做到吗??
- sample&oneInstance()静态示例实例;返回实例;这将始终是同一个实例????
- @Jose:EDOCX1[0]实例不能更改,也许他不想要,而且我的解决方案也不能解决所有问题,没有解决方案可以解决所有问题。我不知道他是不是想要一个const实例。到目前为止,他没有这么说。
- 若泽:哎呀…我没注意到你是那个医生。现在告诉我你到底想要什么?
- @何塞:是的,这永远是同一个例子。即使在函数内部,也只创建一次static变量!
- 另一个问题是:我读了一本书。当我必须创建一个singleton时,静态类*intance();函数必须在cpp文件中声明,否则"将为包含头的每个文件创建一个实例"。我真的不明白。为什么会这样??
- @何塞:没有。你在.cpp文件中定义了函数,否则如果你在.h头中定义了函数,那么你将有该函数的多个定义,就像你可能在多个文件中#include相同的.h头一样。所以为了避免这种多重定义,您需要在.cpp文件中定义函数!
- 嗯,所以如果我把这个函数开发成de.h文件,我会在每个文件中创建一个实例,包括我的头,就像我将有n个相同类的静态实例一样。其中n是包含标题的文件数。我错了吗?
- @何塞:试试看。您将得到以下几行的编译错误:函数的多个定义;或函数的重新定义。像那样。顺便说一下,不要只问问题,试着用它做实验;这是最好的学习方法之一。-)
- 非常感谢你,纳瓦兹,你真的帮了我。我有点不喜欢为业余爱好编程。我在医学和编程的最后一年帮助我缓解压力。如果你需要健康方面的帮助,请联系我。对不起,我的英语很差。再次谢谢。
不要这样做。
我建议您不要在任何时候避免共享任何东西,因为共享会使并发性变得困难。如果您不关心并发性,那么应该将对象作为额外的参数传递给函数。环球旅行通常是个坏主意,而单身者通常只是穿着华丽服装的环球旅行。