考虑以下代码部分:
这是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;
}
现在,因为我想要将Timing的一个对象作为单例模式(只能创建一个时序)。在我的运动要求中,他们说我可以选择2个选项:
在main()中创建一个定时实例,该实例位于另一个文件中,每次将该实例的引用传递给程序中的其余方法,或者我可以在.h文件中创建全局定时定时和状态。定时。我选择了第二种选择。但是,我在全局变量和我的单例模式之间进行连接时遇到了一些困难。
如何在Timing.cpp文件中创建计时实例?
我尝试了Timing timing = CreateInstance(),但这不起作用。
我无法在main()中创建实例,因为那时我将实现第一个选项..
我需要写主时间.CreateInstance()?
我希望我能清楚地解释自己。
谢谢你的帮助
答案 0 :(得分:2)
CreateInstance应该是静态的,你可以这样做:
Timing *timing = Timing::CreateInstance();
当你需要单个实例时,你不需要时序全局变量(只有静态变量_singleInstance)。
哦,正如Scott Langham所指出的,GetInstance比CreateInstance更好。
答案 1 :(得分:2)
您无需创建实例。
将CreateInstance()的名称更改为GetInstance()。
然后,当您想要访问计时对象时,请调用GetInstance。单例将在您第一次访问时创建。
如果这样做,您将不会实现第一个选项,因为您不会在变量中保持GetInstance的返回值。你马上就可以直接使用它。
不要先做第一个选项并保持t:
Timing* t = Timing::GetInstance();
t->DoSomething();
如果您想使用单身人士,请执行以下操作。
Timing::GetInstance()->DoSomething();
(无论如何,这是答案的基本内容 - 从技术上讲,你可以坚持一段时间,只要你不把它作为参数传递给每个想要它的函数,你就可以选择2)
这对你正在做的任务来说已经足够了。
在生产代码中,单身人士的生命时间往往需要更好的控制。为此,我建议有三个功能:
Timing::CreateInstance()
Timing::GetInstance()
Timing::DestroyInstance()
从主函数的开头和结尾调用Create和Destroy。但是,BE AWARE,您需要注意,在调用DestroyInstance()之后,没有代码(甚至是析构函数中的代码)将访问GetInstance()。我建议你至少在GetInstance函数中输入一个断言:
assert(_singleInstance != 0)
return _singleInstance;
并且,在DestroyInstance中执行:
delete _singleInstance;
_singleInstance = 0;