好的,所以我想我了解 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;
我知道这是一个愚蠢的问题,但我是否朝着正确的方向前进?我正在学习很多新技能,以确保这款游戏从一开始就写得很好