VLarin писал(а):
Простой пример - объект CWnd, мембер другого CWnd (например CView), создается с пустыми параметрами при создании последнего, а потом, при первом обращении к объекту из CView происходит его инициализация, так как в момент создания CView хендл окна и прочая хрень не известна и несуществует в природе.
Да, MFC так спроектирована. Вообще MFC очень часто приводят как неиссякаемый источник примеров плохого дизайна.
CWnd может быть в двух состояниях - привязанный к реальному окну или пустой. Во-первых, таких классов немного и их наличие не заставляет переделывать дизайн всех остальных, а во-вторых, никто не мешает завести в них и конструктор с параметром для использования в большинстве простых ситуаций.
VLarin писал(а):
Я просто не фанат исключений, ну не нравятся они мне:))
Если можно все руками проверить, и что нужно сделать, то зачем исключения:).
Я-то думал, что техника придумана для того, чтобы избавить человека от ручного труда
Возьмем пример (из головы, но похожий на реальность):
Код:
try
{
OracleConnection con("host=xxx;login=xxx;passwd=xxx");
con.Open();
OracleCommand cmd("select name, email, salary from employees", con);
OracleDataReader reader(cmd.ExecuteReader());
while(reader.Read())
try
{
SendGreetings(reader.GetString(0), reader.GetString(1), reader.GetInt(2));
}
catch(GreetingsException& e)
{
LogException(e);
}
catch(ConversionException& e)
{
LogException(e);
}
}
catch(Exception& e)
{
LogException(e);
}
Как именно будет выглядеть проверка руками, если ошибки могут произойти:
1. Внутри Open - скажем, пароль не тот.
2. Внутри ExecuteReader - скажем, потерли таблицу.
3. Внутри Read - скажем, отвалилась сеть.
4. Внутри GetInt - скажем, тупой DBA забыл поставить NOT NULL на salary.
5. Внутри SendGreetings - скажем, лежит почтовый сервер.