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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.89
fenix117
8 / 8 / 1
Регистрация: 16.03.2011
Сообщений: 249
#1

Исключения в конструкторе - C++

14.10.2011, 19:31. Просмотров 4062. Ответов 4
Метки нет (Все метки)

Приведите пожалуйста пример, где было бы видно как писать конструктор в классе (инициализация полями класса) используя исключения и нужны ли вообще исключения в конструкторе, если да, как тогда должна вести себя программа в случае некорректных данных.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2011, 19:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Исключения в конструкторе (C++):

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

Генерация исключения в конструкторе - C++
Преподаватель попросил добавить в программу исключения, чтобы если в класс придут некорректный данные класс то не терпел и ругался....

Генерация исключения в конструкторе - C++
Добрый вечер! У меня возник вопрос с генерацией и перехватом исключений. Имеется код: class Mystring { protected: int n; //хранит...

Ошибка в конструкторе - C++
Написал задачу, но она не работает. Условие: Разработать класс Элементарная частица с элементами Название, Группа, Заряд, Масса покоя....

Двоеточие в конструкторе - C++
class A { public: A(): }; Что означает двоеточие и что туда надо писать?

О конструкторе копирования - C++
Доброго времени суток всем присутствующим. Интересует маленький вопрос. В 15-й строке происходит прямое обращение к полю входного объекта...

4
Сыроежка
Заблокирован
14.10.2011, 20:54 #2
Цитата Сообщение от fenix117 Посмотреть сообщение
Приведите пожалуйста пример, где было бы видно как писать конструктор в классе (инициализация полями класса) используя исключения и нужны ли вообще исключения в конструкторе, если да, как тогда должна вести себя программа в случае некорректных данных.
Используется конструкция с try/catch. Например,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct S
{
   S( const char *s )
   try  : p( new char[ std::strlen( s ) + 1 ] )
   {
      std::ctrcpy( p, s );
   }
   catch ( const std::bad_alloc & )
   {
      // некоторый код 
   }
   
private:
   char *p;
};
Писал по памяти, но это близко к истине. Как должна вести себя программа? Э/то уже на ваше усмотрение! Как вы сделаете, так и будет вести себя, начиная от простого завершения работы программы в случае исключения, то продолжения работы программы с игнорированием иселючения.
2
silentnuke
Android Programmer
139 / 140 / 5
Регистрация: 08.12.2010
Сообщений: 421
14.10.2011, 21:05 #3
и стоит помнить что, если исключение не обработано, то c логической точки зрения разрушается объект, который еще не создан, а с технической, так как он еще не создан, то и деструктор этого объекта не будет вызван. это может привести к утечкам, поэтому заранее продумывайте.
1
fenix117
8 / 8 / 1
Регистрация: 16.03.2011
Сообщений: 249
16.10.2011, 15:01  [ТС] #4
Балин я никак не могу понять как использовать эти try/catch помогите пожалуйста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
using namespace std;
 
class Date
{
    int number;     //число
    int month;      //месяц
    int year;       //год
 
    bool number_of_days_per_month(int number, int month, int year)
    {
        //числа начинаются с 1
        if (number < 1)
            return false;
        //номера месяцев в которых 31 день
        if ((month == 1) || (month == 3) || (month == 5) || (month == 7) || (month == 8) || (month == 10) || (month == 12))
            if (number <= 31)
                return true;
            else return false;
        //номера месяцев в которых 30 дней
        if ((month == 4) || (month == 6) || (month == 9) || (month == 11))
            if (number <= 30)
                return true;
            else return false;
        //отдельная история с февралем
        //високосный год февраль - 29 дней
        /*По новому стилю високосным является каждый год, 
        число которого делится на 4 без остатка, за исключением тех годов, 
        числа которых оканчиваются на 2 нуля, но не делятся на 400 
        (например, годы 1700, 1800, 1900 не являются високосными).*/
        if ((year % 4) == 0)
        {
            if ((year % 100) != 0)
            {
                if (number <= 29)
                    return true;
                else
                    return false;
            }
            else
                if ((year % 400) == 0)
                    if (number <= 29)
                        return true;
                    else
                        return false;
        }
        //не високосный год февраль - 28 дней
        else
            if (number <= 28)
                return true;
            else
                return false;
    }
 
public:
    Date (int number, int month, int year)
    {
        try
        {
            if (year > 0)
                this->year = year;
            else
                throw "Неправильно введен год";
            if ((month > 0) && (month <= 12))
                this->month = month;
            else
                throw "Неправильно введен месяц";
            if (number_of_days_per_month(number, month, year))
                this->number = number;
            else
                throw "Неправильно введено число";
        }
        catch (){}
    }
};
1)В случае если элементу класса при инициализации не было присвоено значение объект создается или нет???
2)Зачем нужны исключения, если я мог загнать код в do while чтобы он вводил пока не введет корректные данные? (использовать исключения необходимо по заданию лабы)
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.10.2011, 15:12 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Date::Date (int number, int month, int year)
{
    if (year > 0)
        this->year = year;
    else
        throw "Неправильно введен год";
     if ((month > 0) && (month <= 12))
        this->month = month;
     else
        throw "Неправильно введен месяц";
     if (number_of_days_per_month(number, month, year))
        this->number = number;
     else
        throw "Неправильно введено число";
}
 
int main()
{
    try 
    {
          Date a(...)...
    }
    catch(const char* msg)
    {
       //...
    }
}
Добавлено через 58 секунд
Цитата Сообщение от fenix117 Посмотреть сообщение
я мог загнать код в do while чтобы он вводил пока не введет корректные данные?
не всегда и не у всех есть такая возможность

Добавлено через 27 секунд
Цитата Сообщение от fenix117 Посмотреть сообщение
Зачем нужны исключения
в данном случае вы ответили сами
Цитата Сообщение от fenix117 Посмотреть сообщение
использовать исключения необходимо по заданию лабы)
Добавлено через 1 минуту
Цитата Сообщение от fenix117 Посмотреть сообщение
1)В случае если элементу класса при инициализации не было присвоено значение объект создается или нет???
вообще создается но при выбросе исключения происходит раскрутка стека и все свойства объекта теряются
1
16.10.2011, 15:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2011, 15:12
Привет! Вот еще темы с ответами:

Ошибка в конструкторе - C++
Почему пишет что отсутствуют нужные параметры конструктора? class Aircraft { public: Aircraft(int _maxSpeed, int _maxHeight) { ...

Explicit в конструкторе - C++
Ключевое слово explicit перед конструктором служит лишь для того чтобы не запутаться и передавать аргумент в конструктор явно? Например: ...

Шаблон в конструкторе - C++
class A { template &lt;class Type&gt; A(Type Object) { } friend class B; };

Исключение в конструкторе - C++
#include &lt;iostream&gt; class Vect { public: Vect(char); ~Vect() { try { delete p; } catch (...) { std::cerr &lt;&lt; &quot;Cannot...


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

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

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