考虑以下代码部分:
这是Timing.h:
class Timing {
public:
//creates a single instance of timing. A sinlgeton design pattern
Timing *CreateInstance();
private:
/** private constructor and a static instance of Timing for a singleton pattern. */
Timing();
static Timing *_singleInstance;
};
extern Timing timing;
这是Timing.cpp:
Timing timing; //a global variable of Timing
Timing *Timing::CreateInstance() {
if (!_singleInstance) {
_singleInstance = new Timing();
}
return _singleInstance;
}
现在,由于我想保存一个计时对象,所以我将其作为单例模式制作(只能创建一个计时)。在我的运动要求中,他们说我可以选择以下两种选择:
在另一个文件的main()中创建一个计时实例,然后每次将该实例的引用传递给程序中的其余方法,或者我可以在.h文件中创建全局计时时序和状态extern计时定时。我选择了第二个选项。但是,在全局变量和我的单例模式之间进行连接有一些困难。
如何在Timing.cpp文件中创建计时实例?
我尝试了Timing Timing = CreateInstance(),但是这不起作用。
我无法在main()中创建实例,因为那样我将实现第一个选项。
我是否需要在main Timing.CreateInstance()中编写?
我希望我能清楚地解释自己。
谢谢你的帮助
最佳答案
您无需创建实例。
将CreateInstance()的名称更改为GetInstance()。
然后,当您要访问计时对象时,请调用GetInstance。单例将在您首次访问时创建。
如果执行此操作,则将不会实现第一个选项,因为您不会在变量中保留GetInstance的返回值。您将立即使用它。
不要做第一个选择并保持t不变:
Timing* t = Timing::GetInstance();
t->DoSomething();
要使用单例时,请执行以下操作。
Timing::GetInstance()->DoSomething();
(无论如何,这都是答案的基本要点-从技术上讲,您可以坚持使用t一段时间,只要您不一直将其作为参数传递给需要它的每个函数,就可以进行选择2)
这足以满足您正在执行的任务。
在生产代码中,单例的寿命通常需要更好的控制。为此,我建议您具有以下三个功能:
Timing::CreateInstance()
Timing::GetInstance()
Timing::DestroyInstance()
从主函数的开始和结束处调用创建和销毁。但是,请注意,在调用DestroyInstance()之后,没有代码(甚至在析构函数中)也不会访问GetInstance()。我建议您至少将一个断言放在GetInstance函数中以:
assert(_singleInstance != 0)
return _singleInstance;
并且,在DestroyInstance中执行以下操作:
delete _singleInstance;
_singleInstance = 0;