Re[2]: C++ without exceptions: back to old days
От: NikeByNike Россия  
Дата: 30.07.07 20:19
Оценка:
Здравствуйте, Вертер, Вы писали:

_>>И назрел у меня вопрос а как без исключений-то жили?


В>у нас было правило: никаких new и delete


Почему?
Нужно разобрать угил.
Re[3]: C++ without exceptions: back to old days
От: Вертер  
Дата: 30.07.07 21:32
Оценка: :)
_>>>И назрел у меня вопрос а как без исключений-то жили?

В>>у нас было правило: никаких new и delete


NBN>Почему?


ну, как понимаю у нас была другая специфика: 32 kWord оперативной памяти и 4мб — флеш...
Re[3]: C++ without exceptions: back to old days
От: Left2 Украина  
Дата: 02.08.07 14:33
Оценка:
C>За этот подход в Симбе дизайнера надо придушить. ЧТО УГОДНО будет лучше этих %&*%#$$# LEAVE'ов, даже явная проверка кодов возврата.
Готов лично привести этот приговор в исполнение.
Самый главный удар детскими граблями в этом подходе — это то что деструкторы локальных обьектов не вызовутся. Это заставляет накручивать свой cleanup stack, заставляет делить классы на "те кому деструктор нужен" и "те кому деструктор не нужен", каждой функции добавлять суффикс "можем мы или нет делать leave", и понеслось... Рефакторинг в итоге превращается в кромешный ад.

А как альтернатива — почему не взять COM-овский подход с кодами возврата и макросом типа

#define HR_CHECK(x) { HRESULT res = (x); if (FAILED(res)) return res; }


в который обязать оборачивать каждый вызов функции которая возвращает этот код возврата? и не надо никаких goto, вся очистка в деструкторах обьектов.
Re[2]: C++ without exceptions: back to old days
От: Left2 Украина  
Дата: 02.08.07 14:35
Оценка: :)
_>>И назрел у меня вопрос а как без исключений-то жили?

В>у нас было правило: никаких new и delete


Насчёт никаких delete — это верно для любых программ на С++, не только встроенных
Ну а насчёт никаких new — дык placement new форева на любой платформе!
Re: C++ without exceptions: back to old days
От: co  
Дата: 30.08.07 13:20
Оценка:
Для классов в которых объект может не создаться (например если должен открываться файл) я делаю конструктор закрытым и добавляю статическую ф-ю Create, возвращающую указатель на класс. В случае ошибки возвращается NULL.
Re[2]: C++ without exceptions: back to old days
От: alexeiz  
Дата: 05.09.07 07:56
Оценка:
Здравствуйте, eao197, Вы писали:

E>3. Код ошибки сохраняется в errno, а возвращаемое значение метода сообщает только была ли какая-нибудь ошибка или нет. Например, метод возвращает 0, если все нормально, и -1 в случае ошибки:

E>
E>int makeConfigReader( const char * fileName, auto_ptr< ConfigReader > & readerReceiver )
E>  {
E>    FILE * f = fopen( fileName, "r" );
E>    if( !f )
E>      {
E>        errno = <код ошибки>;
E>        return -1;
E>      }
E>    ...
E>  }

E>auto_ptr< ConfigReader > reader;
E>if( 0 == config.load() )
E>  ... // Ошибок нет.
E>


Вариант 4:
Класс result<T>, который содержит одновременно код ошибки и возвращаемое значение функции. Класс построен по аналогии с boost::optional, только вместо bool флага в optional, определяющего, было ли значение переменной инициализированно, в result<T> сохраняется код ошибки.

Используется примерно так:
result<HKEY> open_key(wstring const & key_name)
{
    HKEY key;
    LONG res = RegOpenKeyEx(HKEY_CURRENT_USER, key_name.c_str(), 0, KEY_READ, &key);

    // result<T> can be initialized either with the value or with the error code
    // the error code type here is HRESULT
    if (res == ERROR_SUCCESS)
        return key;
    else
        return HRESULT_FROM_WIN32(res);
}

result<> close_key(HKEY key)  // result<> is a shortcut for result<void>
{
    LONG res = RegCloseKey(key);
    return HRESULT_FROM_WIN32(res);
}

void test(wstring const & key_name)
{
    wcout << L"key = " << key_name << endl;

    wcout << L"open... ";

    if (result<HKEY> key = open_key(key_name))  // result<T> has operator safe bool
    {
        wcout << L"success\n";

        wcout << L"close... ";

        if (result<> res = close_key(*key))  // *key - dereferencing result<T> returns the value
            wcout << L"success\n";
        else
            wcout << L"failure, code = " << hex << res.error() << endl;
    }
    else
    {
        wcout << L"failure, code = " << hex << key.error() << endl;
    }

    wcout << endl;
}

int main()
{
    test(L"Software");
    test(L"Softwaree");
}

// output:
key = Software
open... success
close... success

key = Softwaree
open... failure, code = 80070002
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.