|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||||||
Virtual и noreturn23.02.2015, 19:57. Показов 10588. Ответов 55
Метки нет (Все метки)
Возможно ли подружить virtual и noreturn? Пишу:
1
|
||||||
| 23.02.2015, 19:57 | |
|
Ответы с готовыми решениями:
55
Protected abstract virtual base pure virtual private destructor Какая разница между "void virtual" и "virtual void"? |
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||
| 25.02.2015, 10:49 | ||
Сообщение было отмечено Renji как решение
РешениеАтрибуты в сигнатуру водят? На данный момент ответ - нет. Нарушений каких-либо со стороны компилятора нет. Виртуальная функция в наследнике - это другая функция, [[noreturn]] на ее не распространяется, точно так же как это не распространяется, например, на gcc-шные __attribute__ ((<что-то>)). Вот и весь ответ. А проверить тот факт, что компиляторы таки это дело отслеживают, можно просто: добавить final и убедиться, что warning пропал. Как только компилятор получил гарантии, что никто не будет более переопределять эту функцию, то сразу убрал warning. Есть факт, ну и чего с ним спорить теперь? Если хочешь изменить положение вещей - можно оформить предложение в комитет, благо есть возможность.
0
|
||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||||||
| 25.02.2015, 12:18 | |||||||
|
Не по теме: Ну наверное потому что это не помощь, а скорее медвежья услуга, от неё больше вреда чем пользы. Я конечно понимаю, что на любом языке можно писать как на фортране, но другим-то зачем это советовать? Чтобы уж совсем не оффтопить, скажу, что топикстартер все правильно делает, нефиг копипастить. Напишу еще один довольно известный приемчик для удобной работы с исключениями, вдруг кто не знает:
0
|
|||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 25.02.2015, 13:45 | |||||||
|
Детали: Если вам известно, что эксепшен является наследником const std::exception, то нет проблемы разрезолвить его в ловушке вида: catch( const std::exception& ex ), что делает void handle() избыточным. Ловушки вида catch( ... ) используется в случаях: 1. Когда точный тип эксепшена не известен. (а значит не существует предусмотренного обработчика на этот случай) Для эвристического анализа ситуации, в отказоустойчивых системах. 2. Когда нужно отложить обработку всех исключений на более поздний срок: http://rextester.com/IUVTX48212
0
|
|||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|||
| 25.02.2015, 14:16 | |||
|
Конкретно вот это:
0
|
|||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||
| 25.02.2015, 14:27 | |||
|
в различных местах без копипасты.
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||||||||
| 25.02.2015, 15:05 | ||||||||
|
И почему нельзя написать так?
0
|
||||||||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||
| 25.02.2015, 15:18 | |||
|
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||
| 25.02.2015, 15:54 | ||
|
Но лично я (лично я) стремился бы к обобщению на уровне иерархий исключений, а не на уровне обработчиков. И мое мнение, что необходимость присутствия совершенно одинаковых портянок из catch`ей (что ты предлагаешь вынести в функцию как решение) в разных частях программы тонко намекает на некую архитектурную проблему. (На всякий случай, вот вопросы, которые помогут понять ход моих мыслей: 1) если действия разные, почему у них одинаковая портянка catch`ей? 2) если действия одинаковые, то почему они в разных частях программы?) Повторюсь, я не экстремист, пропогандировать свое видение в массы не буду. Это лишь мнение.
2
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 26.02.2015, 03:27 | |||
|
однако, он использует это совсем для другой цели: размазывает одинаковые обработки по всему коду проекта. что не есть хорошо.
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|
| 26.02.2015, 09:00 | |
|
0
|
|
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||||||
| 26.02.2015, 16:12 | |||||||
Есть какие-нибудь предложения?
0
|
|||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
||||||
| 26.02.2015, 17:10 | ||||||
|
Voivoid, насколько я вижу, ты предлагаешь учесть в этой задаче следующие ограничения:
1) Данный код - библиотека, которая не имеет права кидать исключения, либо не имеет права кидать исключения не являющиеся наследниками std::exception. Поэтому мы не можем вынести уровень обработки этих ситуаций выше методов update_from_database и store_to_database 2) Вытекает из первого. DBException - не наследник std::exception. 3) По каким-то не зависящим от нас причинам мы не можем заменить DBException на аналогичного наследника std::exception, либо полностью заменить библиотеку работы с DB на другую. Если я все правильно обозначил выше, то соображения будут такие: Я достаточно давно же работаю с legacy и не испытываю никаких иллюзий по поводу таких ситуаций. В том плане, что прекрасно понимаю откуда тут могут расти ноги и какими узлами могут быть связаны руки программистов. Поэтому в этом ключе мне не кажется это решение (постом выше) таким уж страшным (но это не дает нам повода думать, что с архитектурой тут все в порядке). Какие еще варианты я наблюдал при решении подобных ситуаций (в порядке убывания популярности): 1) Пишем макрос. Запихиваем портянку catch-й туда. Называем макрос CATCH_ALL и радуемся. 2) Делаем трансформацию DBException -> db_exception (наследник std::exception) и решаем задачу логирования единообразно, без портянок, на основе общности исключений. Потребует обертки оригинально API, который кидает кривые исключения, для обеспечения этого. 3) Твое решение с функтором. Не смотря на то, что ты назвал его сомнительным (в этой задаче), есть варианты где оно хорошо смотрится и частично снимает похожие проблемы. Для второго варианты код выглядел бы так:
2
|
||||||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||||
| 27.02.2015, 09:48 | |||||
![]()
0
|
|||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|||
| 27.02.2015, 13:51 | |||
|
0
|
|||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||
| 27.02.2015, 14:05 | |||
Тут скорее всего вряд-ли уже чем поможешь.
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
|
|||
| 27.02.2015, 14:18 | |||
|
Ну я понял. Ты говоришь о том, что код написан так, что уровни слабо заизолированы друг от друга. И если при выполнении запроса к базе, после запроса какая-то вспомогательная система тоже дает сбой, то это в конечном итоге влияет на всю транзакцию и ее придется откатывать. Добавлено через 2 минуты В целом я не считаю, что ты не прав (если это имеет для тебя значение). Т.е. мотивация и вариант решения мне понятны и не вызывают отторжения. Просто есть ощущение, что можно лучше
0
|
|||
| 27.02.2015, 14:18 | |
|
Помогаю со студенческими работами здесь
56
virtual PC virtual Virtual в С++ Virtual Wi Fi. virtual pc Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|