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

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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
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
139 / 140 / 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 чтобы он вводил пока не введет корректные данные? (использовать исключения необходимо по заданию лабы)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.10.2011, 15:12     Исключения в конструкторе
Еще ссылки по теме:

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

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

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

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

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

Синтаксис С++. Двоеточие в конструкторе - C++
struct busy_head { size_t size; busy_head(size_t size) : size(size) { }; // Как понимать двоеточие?????????? Заранее...


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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 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     Исключения в конструкторе
Ответ Создать тему
Опции темы

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