С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
#1

Исключения в классах - C++

25.08.2012, 00:42. Просмотров 974. Ответов 18
Метки нет (Все метки)

Здравствуйте.
Какими средствами правильней всего сделать обработку исключений в классах?

C++
1
2
3
4
5
6
7
/* например, эта функция */
int SomeClass::someFunc( int some_arg ) { return some_arg * 18 }
/*
  для нормальной работы
  должна получать числа от 0 до 42. 
  Как реагировать на остальное?
*/
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2012, 00:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Исключения в классах (C++):

Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе - C++
Для каждого из четырех классов указаны имена девочек, обучающихся в них. Определить, какие из этих имен встречаются во всех классах, какие...

Ошибки в классах - C++
Доброго времени суток уважаемые форумчане! В двух словах: есть класс поезд с некоторыми полями и есть класс станция, который содержит...

программа в классах - C++
помогите пожалуйста сделать программу в классах построить описание класса содежащего информацию о почтовом адресе организации....

Ошибка в классах - C++
Добрый день! Мне необходимо разбить 1 класс на 2: базовый и производный! Я вроде сделал, но вылезает ошибка, что нехватает фигурной...

наследование в классах - C++
всем доброго времени суток ! нужно создать виртуальную функцию для заполнения класса данными и печать данных на экран и переопределить...

Перечисления в классах - C++
Не могу понять почему в классах работают перечисления? Я не могу в классе обьявить константу, но я могу ее за менить перечислением вроде...

18
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 00:58 #2
вариантов много. зависит от того, как по концепции (желательно иметь в приложении) должны обрабатываться инвалидные аргументы. можно возвращать некий INVALID_INTEGER, можно бросать исключение (если оно где-то ловится), можно аварийно завершать приложение, занеся в протокол соотв. запись, можно ...
в общем, все, чего твоя фантазия пожелает.
1
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 01:08  [ТС] #3
Спасибо.

1. Как-то это некрасиво и в стиле C.
2. Эх, это ж еще ловить их надо…
3. Выход хороший, в конкретном случае не к месту.

Дело вот в чем: я вроде как разрабатываю набор классов, и было бы неплохо всякое неподобство разрешать наиболее общим и безболезненным методом.
Кстати, как-то можно выбрасывать ошибку еще при компиляции в случае "неподобства"?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.08.2012, 01:13 #4
vortexx1, Только для того, что вы можете проверить на этапе компиляции. В данной функции на этапе компиляции вы ничего проверить не можете.
1
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 01:19 #5
> 1. Как-то это некрасиво и в стиле C.
Это давний срач, что лучше: коды возврата или исключения. (И ассерты сверху.)

> 2. Эх, это ж еще ловить их надо…
Вот это один из минусов исключений, приводимый в тех срачах: исключения нельзя спокойно игнорировать. На код возврата можно спокойно забить.

> Кстати, как-то можно выбрасывать ошибку еще при компиляции в случае "неподобства"?
Только на шаблонной магии, но это слегка сложно, выглядит уродски и не работает для переменных.
В общем случае нельзя: у Си++ не настолько крутая система типов, чтобы ловить такие несоответствия при компиляции (тип "число от 0 до 42" можно ввести только своим классом). Функция выполняется не при компиляции, а при выполнении программы. Тогда же она выкидывает все ошибки.

Конкретное решение больше зависит от того, кому нужна эта ошибка, когда она может произойти и насколько она фатальна. То есть кто обязан следить за тем, чтобы число находилось в пределах [0; 42]. Универсальный вариант: выкинуть исключение, а дальше это уже проблемы того, кто передаёт мусор в вашу функцию.
2
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.08.2012, 01:28 #6
Собственно примерно такие шаблонные функции обеспечивают проверку на этапе компиляции.

C++
1
2
3
4
5
6
template<int some_arg>
int SomeClass::someFunc() 
{ 
   static_assert(some_arg >= 0 && some_arg < 42, "asserted");
   return some_arg * 18;
}
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 01:37 #7
никаких проблем! заведи себе ф-ю, которая принимает некий enum в этом роде:
C++
1
2
3
4
5
enum _0_to_42 {
 _0 = 0,
 _1,
...
 _42};
, и проблема решена. некрасиво, но как ты хочешь.
0
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 01:41  [ТС] #8
Хм, ForEveR, может, что-то вроде этого как раз и нужно. Как оно по-научному называется, чтоб можно было погуглить и почитать?

Добавлено через 1 минуту
novi4ok, неа, так точно не хочу.
Спасибо.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 01:45 #9
Цитата Сообщение от vortexx1 Посмотреть сообщение
Хм, ForEveR, может, что-то вроде этого как раз и нужно. Как оно по-научному называется, чтоб можно было погуглить и почитать?
между делом, так. сегодня как раз пришлось разгребать кучу, которую наворотил один внешний сотрудник лет 5 назад. он любил templstes больше жизни. понять, как эта кухня работает, не может даже он (имею доказательство: как-то, когда очередной раз "горело", позвали. пришел, два часа пялился в код, извинился и ушел).
я угрохал сегодня целый день, чтобы сделать простейшую вещь. как оно все функционирует - был, есть и буду без понятия. дерьмо последнее. до рыгачки доводит разбираться. посему - никакой гарантии, что я сделал лучше, а не хуже - дать не могу.
гугли, читай. может, тоже в крутые попадешь.
0
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 01:46  [ТС] #10
И да, специально обученному идиоту вроде ничего не должно помешать сделать
C++
1
someFunc( (SomeClass::SomeEnum)43 );
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
25.08.2012, 01:47 #11
Крутые сразу пишут на Хаскелле и смотрят на ваши темплейты как на брейнфак.

Называется это non-type template parameters. Всё замечательно, но так нельзя передавать переменные и объекты, только обычные, буквально записываемые константы.
1
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 01:51  [ТС] #12
novi4ok, спасибо. Поучительно.

Добавлено через 2 минуты
~OhMyGodSoLong~, не упоминай Господа всуе.
Время Хаскелла еще не настало.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
25.08.2012, 02:28 #13
novi4ok, А это смотря как человек использует шаблоны, да. Любой возможностью плюсов можно выстрелить себе в ногу. Тот же буст состоит из шаблонов чуть более, чем полностью и прекрасно функционирует. А так же локи и прочие либы такого уровня.
1
vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
25.08.2012, 11:38  [ТС] #14
В общем, решил использовать throw-catch-конструкции, всем спасибо.

Добавлено через 7 минут
Кстати, такой еще вопрос:

C++
1
2
3
4
5
6
7
8
9
#include <deque>
 
class SomeClass {
public:
    SomeClass();
    void shuffle();
private:
    deque< int > d;
};
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "SomeClass.h"
#include <algorithm>
/* 
     правильно ли я поступил,
     включив algorithm в этом файле?
     Или его надо было подключить еще в заголовочном?
*/
 
SomeClass::SomeClass() {}
void SomeClass::shuffle() {
    // do something
}
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
25.08.2012, 12:11 #15
Цитата Сообщение от ForEveR Посмотреть сообщение
novi4ok, А это смотря как человек использует шаблоны, да. Любой возможностью плюсов можно выстрелить себе в ногу. Тот же буст состоит из шаблонов чуть более, чем полностью и прекрасно функционирует. А так же локи и прочие либы такого уровня.
я не против шаблонов как явление. я против попытки каждую одноразовую проблему решать с их помощью, тулить их где только возможно. шаблоны хороши, когда:
- можно довольно просто понять, как ими пользоваться.
- они могут использоваться для широкого класса задач, а не только для А и Б
- они один раз отлажены, вылизаны, и никогда (!) не придется там что-то менять.
- их использование один раз не должно вынуждать тянуть в приложение туеву хучу каких-то неизвестных кусков чего-то.
0
25.08.2012, 12:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.08.2012, 12:11
Привет! Вот еще темы с ответами:

Конструкторы в классах - C++
Здравствуйте уважаемые форумчане! Прошу Вас помочь мне уяснить работу конструкторов в классах! А точнее что нужно сделать что бы...

функции в классах - C++
есть класс my_class, у него есть две функцииmy_class::X_definition(int k, long double t ) {... return x; }; ...

константы в классах - C++
в классе используется константа типа double. Как правильно задать ее? как static const double внутри класса или просто написать...

Подробнее о классах - C++
Извините если я не туда зашел. Я например хочу освоить на хорошем уровне классы. Ну в дальнейшем для написания начальных уровней игр, ну то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.