gpt4 book ai didi

c++ - 具有全局变量的单例模式

转载 作者:搜寻专家 更新时间:2023-10-31 01:21:35 24 4
gpt4 key购买 nike

考虑以下代码部分:

这是 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 文件中创建一个全局计时计时和状态 extern Timing定时。我选择了第二个选项。但是,我在连接全局变量和我的单例模式时遇到了一些困难。如何在 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()

从主函数的开始和结束调用 Create 和 Destroy。但是,请注意,您需要注意在调用 DestroyInstance() 之后没有代码(即使是析构函数中的代码)访问 GetInstance()。我建议您至少在 GetInstance 函数中放置一个断言:

assert(_singleInstance != 0)
return _singleInstance;

并且,在 DestroyInstance 中执行:

delete _singleInstance;
_singleInstance = 0;

关于c++ - 具有全局变量的单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3669461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com