具有全局变量的单例模式

时间:2010-09-08 15:44:00

标签: c++

考虑以下代码部分:

这是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()?
我希望我能清楚地解释自己。 谢谢你的帮助

2 个答案:

答案 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;