【问题标题】:RAII issue regarding resource manager class关于资源管理器类的 RAII 问题
【发布时间】:2016-03-02 16:13:15
【问题描述】:

我有一个名为WindowHandlerSDL_Window 包装类作为Game 类中的类成员。最好,我想在我的Game::init 方法中初始化WindowHandler。但是,该类没有 0 参数 ctor,因此如果我不在初始化列表中初始化 WindowHandler 变量,程序将中断。有没有办法延迟Game::init方法的初始化?

【问题讨论】:

  • RAII 的目的是不延迟初始化,而是在创建对象时完成。
  • X-Y问题,为什么要延迟初始化?
  • 简单解决方案:不要在Game 类中使用init 方法,而是使用构造函数进行初始化。然后,您也可以在其构造函数中初始化Game 类的成员。
  • 对我来说,初始化 init 函数中的所有内容似乎更干净......但如果没有办法解决它,那么我想我会在 ctor 中初始化所有内容
  • 违反了RAII。您最终会得到无效的 Game 对象,因为它们尚未初始化。这可以通过在 ctor 中进行初始化来避免。为什么单独的方法更“干净”?

标签: c++ c++11 raii


【解决方案1】:

解决这个问题的一般方法是有

unique_ptr<WindowHandler> window;

而不是普通的

WindowHandler window;

成员,那么你可以延迟调用它的构造函数。

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

它仍然会被自动销毁。

(我在这里是技术人员,如果这是一个好的或坏的设计,或者它是否违反了 RAII,则超出了当前范围)。

【讨论】:

  • 我认为这是一个很好的答案。为了将来参考,看起来std::experimental::optional 也可以工作,因为它也调用了 dtor。不过,可以想象optional 的实现不需要动态内存分配,因此它可能具有一些优势。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 2023-04-09
  • 2017-01-03
  • 1970-01-01
  • 2019-12-05
  • 2012-08-07
相关资源
最近更新 更多