Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于资源管理器类的RAII问题_C++_C++11_Raii - Fatal编程技术网

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);
}