Почитал соседнюю ветку, и вспомнилось...
Принцип создания функции инициализации:
BOOL CApp::InitCommon()
{
try
{
if(!m_zero.InitCommon())
throw 0;
if(!m_one.InitCommon())
throw 1;
if(!m_two.InitCommon())
throw 2;
//...
}
catch(int iExc)
{
switch(iExc)
{
//...
case 3:
m_two.UninitCommon();
case 2:
m_one.UninitCommon();
case 1:
m_zero.UninitCommon();
}
return FALSE;
}
return TRUE;
}
у меня конкретно в коде были вызовы статических методов классов для инициализации общих данных, (через C:: ).
чтоб понятнее, в чём суть, лучше так:
BOOL CApp::Init()
{
try
{
m_hSome0 = InitSome0()
if (!m_hSome0)
throw 0;
m_hSome1 = InitSome1()
if (!m_hSome1)
throw 1;
m_hSome2 = InitSome2()
if (!m_hSome2)
throw 2;
//...
}
catch(int iExc)
{
switch(iExc)
{
//...
case 3:
Release(hSome2);
case 2:
Release(hSome1);
case 1:
Release(hSome0);
}
return FALSE;
}
return TRUE;
}
Часто в примерах встречал код, который инициализировал некоторые члены класса один за другим, в случае ошибки делал деинициализацию уже готовых. В результате к хвосту функции число вызова деинициализаторов было велико. Ну и повторы кода на каждом условии.
Как вариант, люди использовали некую булеву переменную для понимания, что инициализации идут хорошо, каждая новая инициализация обкладывалась условием на эту переменную. В конце эта переменная проверялась, если false, то проверялись опять же все хендлы на валидность, и делалась деинициализация.
Мне кажется, мой код проще и нагляднее, быстро расширяется, можно не бояться забыть, что что-то пропустил.
Жду: критику, доработку, идеи