假设我有一个名为 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
最佳答案
听起来你希望这些方法是static
,然后还维护一个事件对象数量的私有(private)静态计数,它在构造函数中递增/递减并检查,并且析构函数。
显然,如果这是一个多线程应用程序,您将需要某种形式的同步。
关于c++ - 如何确保成员函数被调用一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15259660/