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

时间:2013-03-06 22:46:16

标签: 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

3 个答案:

答案 0 :(得分:3)

听起来您希望这些方法为static,然后还保持活动对象数的私有静态计数,在构造函数和析构函数中递增/递减和检查。 / p>

显然,如果这是一个多线程的应用程序,你需要某种形式的同步。

答案 1 :(得分:0)

您可以创建一个新类,在构造时调用init函数,在销毁时调用quit函数,然后使类的所有实例在构造时接收到该类的实例的shared_ptr。

class foo_init_quit {
    public:
      foo_init_quit(){init();}
      ~foo_init_quit(){quit();}
};

std::vector<foo> do_something() {
    auto init_quit = make_shared<foo_init_quit>();
    std::vector<foo> vec;
    vec.emplace_back(init_quit);
    //...
    return vec;
}

答案 2 :(得分:0)

struct Funkay
{
    Funkay() : { ++count; init(); }
    ~Funkay() { --count; quit(); }

private:
    static size_t count;
    void init() { if (count == 1) ???; }
    void quit() { if (count == 0) ???; }
};
size_t Funkay::count = 0;