0

好的,所以我我了解 RAII。我想我也知道异常安全是什么。

为了符合 RAII,并试图使我的代码更加安全,我试图从我的 cMain 类中删除一个错误余量。之前,它会有一个 cD3D 类型的普通私有成员,然后在创建我的 HWND 对象后,我将在 cMain 的构造函数中调用 Initialize(HWND) on。

当然,这在某种程度上违背了 RAII 的观点,因为 cD3D 被定义为

class cMain
{   
public:
    cMain(HINSTANCE hInstance, LPTSTR applicationName);
private:
    cD3D m_d3d;
};

(我已经修剪了一些其他成员,因为它们与此查询无关)

cMain 的构造如下:

cMain::cMain(HINSTANCE hInstance, LPTSTR applicationName)
{
    m_hInstance = hInstance;
    m_applicationName = applicationName;
    m_hWnd = CreateNewWindow(hInstance, applicationName);
    m_d3d.Initialize();
}

从而在构造 cMain 时为 m_d3d 获取资源。然后单独调用初始化。我不喜欢这个并且从来没有,因为它留下了一个想法,即在某个地方有人可能会忘记初始化一个对象,因此可能会引发异常。在这种情况下,它并不是特别糟糕,因为我确保它在任何事情发生之前都已经完成,但我经常担心添加检查以确保在使用对象之前对其进行初始化。我还私有化了默认构造函数和复制构造函数,所以不能使用它们,以确保使对象始终正确初始化它。

然后我将其更改为以下内容:

class cMain
{
public:
    cMain(HINSTANCE hInstance, LPTSTR applicationName);
private:
    cD3D& m_d3d;
};

cMain::cMain(HINSTANCE hInstance, LPTSTR applicationName)
    :
    m_hInstance(hInstance), 
    m_applicationName (applicationName),
    m_hWnd(CreateNewWindow(hInstance, applicationName)),
    m_d3d(*new cD3D(m_hWnd))
{
}

出于某种原因,这感觉更安全,除了新的 cD3D(m_hWnd) 和取消引用它。

这是 RAII 的正确做法吗?为其他课程这样做是否应该减少我对异常的暴露?除此之外,我不得不改变 cD3D 在 cMain 中的存储方式,因为我使 cD3D 的复制构造函数无法访问(出于相同的原因),因此不得不改变

cD3D m_d3d;

cD3D& m_d3d;

我知道这是一个愚蠢的问题,但我是否朝着正确的方向前进?我正在学习很多新技能,以确保这款游戏从一开始就写得很好

4

0 回答 0