如何确保成员函数只被调用一次
How to make sure a member function is called once
假设我有一个名为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
,然后还维护一个私有的静态活动对象数量计数,该计数是递增/递减的,并在构造函数和析构函数中进行检查。
显然,如果这是一个多线程应用,你将需要某种形式的同步。
您可以创建一个新类,在构造时调用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;
}
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;
相关文章:
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 什么是仅调用一次并调用参数的控制台应用
- 谷歌基准测试,如何只调用一次代码?
- Android JNI RegisterNatives:对所有内容调用一次,或者每个函数调用一次
- 系统调用:一次和多次,哪个更好?
- C++菱形问题 - 如何仅调用一次基方法
- 函数被多次执行,同时调用一次
- 只为NOT STATIC类的EACH对象调用一次方法
- 通过调用一次新运算符大容量分配对象
- Boost::asio::async_write,处理程序只调用一次
- 为什么析构函数被调用两次,而构造函数只被调用一次
- 强制子类实现并调用(一次)方法
- 等待中的谓词在循环中使用notify时只调用一次
- boost::future-是否保证wait_callback只被调用一次
- 为什么这个函数只被调用一次
- Qpid质子on_sendable只被调用一次
- 每次选择参数时调用一次的静态变量和函数
- 如何只执行一次方法代码,尽管每帧调用一次
- 在c++中调整vector大小时调用一次类构造函数