Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.89
fenix117
8 / 8 / 1
Регистрация: 16.03.2011
Сообщений: 249
14.10.2011, 19:31     Исключения в конструкторе #1
Приведите пожалуйста пример, где было бы видно как писать конструктор в классе (инициализация полями класса) используя исключения и нужны ли вообще исключения в конструкторе, если да, как тогда должна вести себя программа в случае некорректных данных.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2011, 19:31     Исключения в конструкторе
Посмотрите здесь:

C++ ощибка в конструкторе
C++ Двоеточие в конструкторе
Шаблон в конструкторе C++
C++ Параметр в конструкторе копирования
C++ О конструкторе копирования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
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;
};
Писал по памяти, но это близко к истине. Как должна вести себя программа? Э/то уже на ваше усмотрение! Как вы сделаете, так и будет вести себя, начиная от простого завершения работы программы в случае исключения, то продолжения работы программы с игнорированием иселючения.
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
14.10.2011, 21:05     Исключения в конструкторе #3
и стоит помнить что, если исключение не обработано, то c логической точки зрения разрушается объект, который еще не создан, а с технической, так как он еще не создан, то и деструктор этого объекта не будет вызван. это может привести к утечкам, поэтому заранее продумывайте.
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 чтобы он вводил пока не введет корректные данные? (использовать исключения необходимо по заданию лабы)
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 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)В случае если элементу класса при инициализации не было присвоено значение объект создается или нет???
вообще создается но при выбросе исключения происходит раскрутка стека и все свойства объекта теряются
Yandex
Объявления
16.10.2011, 15:12     Исключения в конструкторе
Ответ Создать тему
Опции темы

Текущее время: 23:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru