Попытка обдумать несколько вещей: RAII и исключительная безопасность

Хорошо я считать Я понимаю RAII. Я думаю, что у меня есть представление о безопасности исключений.

Чтобы соответствовать RAII и сделать мой код более безопасным, я попытался удалить поле для ошибки из моего класса cMain. Раньше у него был бы обычный закрытый член типа cD3D, который я бы затем назвал Initialize (HWND) в конструкторе cMain после создания моего объекта HWND.

Конечно, это в некоторой степени не поддается смыслу 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();
}

и, таким образом, получает ресурсы для m_d3d при создании cMain. Инициализация затем вызывается отдельно. Мне это не нравится и никогда не нравилось, потому что это оставляет открытой идею, что где-то кто-то может забыть инициализировать объект, и поэтому могут возникать исключения. В этом случае это не особенно плохо, потому что я проверяю, что все завершено, прежде чем что-то случится, но я часто беспокоюсь о добавлении проверок, чтобы убедиться, что объект инициализирован перед его использованием. Я также приватизировал конструктор по умолчанию и конструктор копирования, поэтому их нельзя использовать, чтобы гарантировать, что создание объекта всегда инициализирует его должным образом.

Затем я изменил его на следующее:

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;

Я знаю, что это глупый вопрос, но я иду в правильном направлении? Я изучаю много новых навыков, чтобы убедиться, что эта игра написана хорошо с самого начала

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]