C++ 关于资源管理器类的RAII问题
我有一个名为C++ 关于资源管理器类的RAII问题,c++,c++11,raii,C++,C++11,Raii,我有一个名为WindowHandler的SDL\u窗口包装类,作为我的游戏类中的类成员。最好是在我的Game::init方法中初始化WindowHandler。但是,该类没有0参数,因此如果我不初始化初始化列表中的WindowHandler变量,程序将中断。有没有办法延迟初始化到Game::init方法?一般的解决方案是 unique_ptr<WindowHandler> window; 成员,则可以延迟调用其构造函数 void Game::init(int arg) {
WindowHandler
的SDL\u窗口
包装类,作为我的游戏
类中的类成员。最好是在我的Game::init
方法中初始化WindowHandler
。但是,该类没有0参数,因此如果我不初始化初始化列表中的WindowHandler
变量,程序将中断。有没有办法延迟初始化到Game::init
方法?一般的解决方案是
unique_ptr<WindowHandler> window;
成员,则可以延迟调用其构造函数
void Game::init(int arg) {
window = make_unique<WindowHandler>(arg);
}
void Game::init(int arg){
窗口=使_唯一(arg);
}
它仍然会被自动销毁
(我在这里是技术性的,如果这是一个好的或坏的设计,或者违反了RAII,则不在当前范围内)。RAII的目的不是延迟初始化,而是在创建object.X-Y问题时完成初始化,为什么需要延迟初始化?简单的解决方案是:不要在
Game
类中使用init
方法,而是使用构造函数进行初始化。然后,您也可以在其构造函数中初始化游戏
类的成员。。。但是如果没有办法的话,我想我会把这一切都归咎于它违反了RAII。您将得到无效的Game
对象,因为它们尚未初始化。这可以通过在ctor中进行初始化来避免。为什么单独的方法“更干净”?我认为这是一个很好的答案。作为将来的参考,它看起来也可以工作,因为它还调用dtor。不过,可以想象不需要动态内存分配的optional
实现,因此它可能有一些优势。
void Game::init(int arg) {
window = make_unique<WindowHandler>(arg);
}