【发布时间】:2013-03-06 22:46:16
【问题描述】:
假设我有一个名为 foo 的对象列表。我如何确保在创建第一个 foo 时调用成员 init() 但只调用一次。另外我如何确保当最后一个对象被销毁时,成员 quit() 被调用但只调用一次。
我知道 c++11 有 std::call_once 而对于 c++03 boost 有 boost::call_once。
我的第一次尝试看起来是这样的,但是退出的部分显然是错误的:
class foo
{
public:
foo() { init(); }
~foo()
{
// this is wrong
quit();
}
private:
void init()
{
static boost::once_flag flag = BOOST_ONCE_INIT;
boost::call_once( flag, [] () { /* init something */ } );
}
void quit()
{
static boost::once_flag flag = BOOST_ONCE_INIT;
boost::call_once( flag, [] () { /* quit something */ } );
}
};
有没有办法仅依靠 c++ 工具来使其正确?
这是我实际尝试做的一个小补充。我正在尝试将 SDL 窗口包装在 c++ 类中,并希望调用 SDL_Init() 和 SDL_Quit 以及适当的时间。 我的第一次尝试在这里:http://pastebin.com/Y9X0UwUB
【问题讨论】:
-
call_once用于多个线程尝试调用一个函数,并且只有其中一个真正成功调用它。 -
您能否详细说明
init()的作用和foo的含义?对此也有同样可行的解决方案,但最好的建模方法取决于您的情况。 -
@sftrabbit -
call_once也适用于单线程应用程序。不过,开销比其他方式可能要多一些。 -
@GManNickG 我正在尝试创建一个包含 SDL 窗口的 SDL 包装器。在创建第一个窗口之前,我需要调用 SDL_Init,而当最后一个窗口被销毁时,我喜欢调用 SDL_Quit。我的初稿在这里:pastebin.com/Y9X0UwUB