Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наследование от классов STL 
V
    Опции темы
Alexeis
Дата 20.2.2011, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



mes, ну как раз как ты писал. Нашел нужный элемент или проверил, сгенерил исключение и вышел наружу с результатом. Результат можно передать в исключение. Ниже обработки исключения гарантировано освободил все ресурсы. Код получается компактным и прозрачным. 
  А на счет скорости, так это особенности реализации. Кто как реализует у того так и работает.
  


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 21.2.2011, 00:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alexeis @  20.2.2011,  22:35 Найти цитируемый пост)
Нашел нужный элемент или проверил, сгенерил исключение и вышел наружу с результатом

но чем return не угодил ?!

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

Добавлено через 14 минут и 19 секунд
Цитата(volatile @  20.2.2011,  15:02 Найти цитируемый пост)
Я бы это вообще вот так написал.

ну приз заслужили,  вполне конкурентноспособный вариант.. 
smile


--------------------
PM MAIL WWW   Вверх
Alexeis
Дата 21.2.2011, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(mes @  21.2.2011,  01:16 Найти цитируемый пост)
но чем return не угодил ?!

  читай ниже. Есть работа которую нужно выполнить перед выходом. А так всего одна точка для выхода где все делается правильно, иначе пришлось бы писать дублирующий код в нескольких местах, что ненадежно и потенциально опасно возможными ошибками.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mes
Дата 21.2.2011, 00:57 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Alexeis @  20.2.2011,  23:48 Найти цитируемый пост)
Есть работа которую нужно выполнить перед выходом. 

чем RAII не угодил ?


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 21.2.2011, 08:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



volatile

Ну как раз вот этой "елочки" я и пытался избежать smile

Добавлено через 1 минуту и 24 секунды
Цитата(mes @  21.2.2011,  00:57 Найти цитируемый пост)
чем RAII не угодил ? 

присойденяюсь к вопросу.
PM   Вверх
Alexeis
Дата 21.2.2011, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



  Так речь не только о освобождении ресурсов, возможно требуется изменить состояние нескольких объектов. Это может быть объект ядра системы.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
azesmcar
Дата 21.2.2011, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Alexeis

Мне все равно непонятно. Хотелось бы посмотреть на пример, где по твоему кидать исключение вместо return является хорошим решением.
PM   Вверх
Alexeis
Дата 21.2.2011, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Код

LPCTSTR  CCommandParser::DoCommand(LPCTSTR acmd, OUT HANDLE &CmdDone, OUT cmd_status* &Status)
{
    CmdDone = ErrExecDone;

    try
    {
        if (FBusy) throw GetErrorString(err_unit_busy);

        const tstring prefix(VT_DEVICE_NAME_PREF TEXT("."));

        static CmdExecData CED;
        CED.CmdParams.clear();
        if (parse_cmd(acmd, prefix, CED.CmdName, CED.CmdParams))
        {
            CmdMap_class::iterator CmdIt = CmdMap.find(CED.CmdName);

            if (CmdIt != CmdMap.end())
            {
                ResetEvent(CED.CmdExecDone);
                CmdDone           = CED.CmdExecDone;
                CED.ExecFunct     = CmdIt->second;
                CED.CmdExecStatus = &Status;
                TM2->AddAsyncCall(DoAsyncExecCall, &CED);
            }
            else
                throw GetErrorString(err_unknown_command);
        }
        else
            throw GetErrorString(err_unknown_command);

        return TEXT("");
    }
    catch(LPCTSTR reason)
    {
        static cmd_status st = st_error;
        Status = &st;
        SetEvent(ErrExecDone);
        return reason;
    }
}



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Abyx
Дата 21.2.2011, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



Код

LPCTSTR DoCommand_impl(LPCTSTR acmd, OUT HANDLE &CmdDone, OUT cmd_status* &Status)
{
     CmdDone = ErrExecDone;

     if(FBusy)
         return GetErrorString(err_unit_busy);

     const tstring prefix(VT_DEVICE_NAME_PREF TEXT("."));
     static CmdExecData CED;
     CED.CmdParams.clear();
     if(!parse_cmd(acmd, prefix, CED.CmdName, CED.CmdParams))
          return GetErrorString(err_unknown_command);

     CmdMap_class::iterator CmdIt = CmdMap.find(CED.CmdName);
     if (CmdIt == CmdMap.end())
         return GetErrorString(err_unknown_command);

     ResetEvent(CED.CmdExecDone);
     CmdDone           = CED.CmdExecDone;
     CED.ExecFunct     = CmdIt->second;
     CED.CmdExecStatus = &Status;
     TM2->AddAsyncCall(DoAsyncExecCall, &CED);

     return TEXT(""); // return NULL ?
}

LPCTSTR  CCommandParser::DoCommand(LPCTSTR acmd, OUT HANDLE &CmdDone, OUT cmd_status* &Status)
{
    LPCTSTR error = DoCommand_impl(acmd, CmdDone, Status);
    if(error && *error) // error == NULL on "no error" ?
    {
        static cmd_status st = st_error;
        Status = &st;
        SetEvent(ErrExecDone);
    }
    return error;
}


Это сообщение отредактировал(а) Abyx - 21.2.2011, 11:19
PM MAIL   Вверх
baldina
Дата 21.2.2011, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(Abyx @  20.2.2011,  22:23 Найти цитируемый пост)
исключения С++ слишком медленные, чтобы использовать их иначе кроме как в исключительных ситуациях. 

за исключением ситуаций, где сама ситуация медленная  smile 
например интерфейс пользователя
PM MAIL   Вверх
Alexeis
Дата 21.2.2011, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Abyx, вот и появилась лишняя сущность на ровном месте smile , а также вызов функции с передачей кучи параметров, а потом еще проверка результата чтобы потом выдать свой результат. Верх читабельности.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Abyx
Дата 21.2.2011, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 1
Всего: 10



Alexeis, там надо еще больше сущностей. Твоя функция слишком много знает и умеет.
PM MAIL   Вверх
mes
Дата 21.2.2011, 15:42 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Alexeis, спасибо за код.. все стало ясно..  smile
согласен, если писать на С++ не С++-код, то и исключения пригождаются...
smile 

Это сообщение отредактировал(а) mes - 21.2.2011, 15:42


--------------------
PM MAIL WWW   Вверх
volatile
Дата 22.2.2011, 00:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Исключения практически незаменимы при выходе из глубокой рекурсии.
Правда насчет скорости не обращал внимания, надо будет как нибудь замерить, насколько сильно тормозит по сравнению с ретурном.

Добавлено через 2 минуты и 20 секунд
Цитата(mes @  21.2.2011,  00:16 Найти цитируемый пост)
ну приз заслужили, 

mes, thx smile 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.