2016-03-02 68 views
1

我有一個SDL_Window包裝類,稱爲WindowHandler作爲我的Game類中的類成員。優選地,我想在我的Game::init方法中初始化WindowHandler。但是,該類沒有0參數,所以如果我不初始化初始化列表中的WindowHandler變量,程序將中斷。有沒有辦法延遲初始化到Game::init方法?有關資源管理器類的RAII問題

+3

RAII的目的是不要延遲初始化,而是在創建對象時完成它。 – NathanOliver

+3

X-Y問題,爲什麼你需要延遲初始化? – user3528438

+0

簡單的解決方案:不要在你的Game類中使用'init'方法,而是在初始化時使用構造函數。然後,你也可以在構造函數中初始化Game類的成員。 –

回答

3

一般的解決方案是有

unique_ptr<WindowHandler> window; 

而不是純

WindowHandler window; 

成員,那麼你可以調用它與延遲構造。

void Game::init(int arg) { 
    window = make_unique<WindowHandler>(arg); 
} 

它會自動銷燬。

(我是技術人員,如果這是一個好的或壞的設計,或者如果它違反RAII超出當前範圍)。

+1

我認爲這是一個很好的答案。爲了將來的參考,它看起來像['std :: experimental :: optional'](http://en.cppreference.com/w/cpp/experimental/optional/~optional)也可以工作,因爲它也稱爲dtor 。可以想象,可選的實現不需要動態內存分配,所以它可能有一些優勢。 –