比方說,我有一個名爲foo的對象的列表。我如何確保在創建第一個foo時調用成員init(),但只調用一次。另外我如何確保何時最後一個對象被銷燬,成員quit()被調用但只有一次。如何確保一個成員函數被調用一次
我知道C++ 11有標準:: 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
'call_once'是多個線程試圖調用一個功能,只有其中一人在呼喚它實際上成功。 – 2013-03-06 22:52:40
你可以擴展一下'init()'和'foo'代表什麼?對此有同樣可行的解決方案,但建模的最佳方式取決於您的情況。 – GManNickG 2013-03-06 23:00:42
@sftrabbit - 'call_once'也適用於單線程應用程序。儘管如此,可能會有更多的開銷。 – 2013-03-06 23:07:55