假设我有一个名为 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