c++ - 如何确保成员函数被调用一次

标签 c++ boost c++11

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

相关文章:

boost - 如何使用 boost::program_options 解析逗号分隔值?

c++ - boost::archive::text_oarchive 的简单扩展

c++ - 动态分配时将 C++11 对象添加到列表?

c++ - 在 g++ 4.8.1 编译器中测试 atomic_int

c++ - 在 Visual C++ 中执行此操作的更好方法是什么?

c++ - C++ 中的 ReadFile 崩溃

c++ - cout 最慢的处理器 MPI

c++ - 如何为模板变量赋予随机值?

c++ - 为什么在使用绝对时间调用时 boost::timed_wait 会永远阻塞?

c++11 - Sfinae 和模板特化