foo というオブジェクトのリストがあるとします。最初の foo が作成されたときにメンバー init() が一度だけ呼び出されるようにするにはどうすればよいですか。また、最後のオブジェクトが破棄されたときにメンバー quit() が呼び出されるのは1回だけであることを確認するにはどうすればよいですか。
私は、c++1 には std::call_once があり、c++03 には 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 ++機能に頼るだけでこれを正しくする方法はありますか?
ここで、私が実際にやろうとしていることへの小さな追加があります。C++ クラス内で SDL ウィンドウをラップしようとしていて、SDL_Init() と SDL_Quit と適切な時間を呼び出したいと考えています。私の最初の試みはここにあります:http://pastebin.com/Y9X0UwUB