0

わかりました、 RAII を理解していると思います。例外の安全性についても理解していると思います。

RAII に準拠するために、またコードをより例外的に安全なものにするために、cMain クラスからエラーのマージンを取り除こうとしました。以前は、cD3D 型の通常のプライベート メンバーがあり、HWND オブジェクトを作成した後、cMain のコンストラクターで Initialize(HWND) を呼び出していました。

もちろん、これは、cD3Dがそのように定義されているという点で、RAIIの要点にある程度反しています。

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 のリソースを取得します。次に、Initialize が個別に呼び出されます。私はこれが好きではなく、決して持っていません。どこかで誰かがオブジェクトを初期化するのを忘れて例外がスローされる可能性があるという考えを開いたままにするからです。この場合、何かが起こる前にすべてが終了していることを確認するため、特に悪いことではありませんが、オブジェクトが使用される前に初期化されていることを確認するためのチェックを追加することについて心配することがよくあります。また、デフォルト コンストラクターとコピー コンストラクターをプライベート化したので、それらを使用することはできません。

その後、次のように変更しました。

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のコピーコンストラクターにアクセスできないようにしたため(同じ理由で)、cD3DをcMainに保存する方法を変更する必要があり、変更する必要がありました

cD3D m_d3d;

cD3D& m_d3d;

ばかげた質問であることはわかっていますが、正しい方向に向かっていますか? このゲームが最初から適切に作成されていることを確認するために、多くの新しいスキルを学んでいます

4

0 に答える 0