考虑以下代码部分:

这是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;

09-07 10:23