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