Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/40: Рейтинг темы: голосов - 40, средняя оценка - 4.60
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257

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

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

Студворк — интернет-сервис помощи студентам
Приведите пожалуйста пример, где было бы видно как писать конструктор в классе (инициализация полями класса) используя исключения и нужны ли вообще исключения в конструкторе, если да, как тогда должна вести себя программа в случае некорректных данных.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2011, 19:31
Ответы с готовыми решениями:

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

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

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

4
Заблокирован
14.10.2011, 20:54
Цитата Сообщение от 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
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
14.10.2011, 21:05
и стоит помнить что, если исключение не обработано, то c логической точки зрения разрушается объект, который еще не создан, а с технической, так как он еще не создан, то и деструктор этого объекта не будет вызван. это может привести к утечкам, поэтому заранее продумывайте.
1
8 / 8 / 2
Регистрация: 16.03.2011
Сообщений: 257
16.10.2011, 15:01  [ТС]
Балин я никак не могу понять как использовать эти 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
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
16.10.2011, 15:12
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.10.2011, 15:12
Помогаю со студенческими работами здесь

Освобождение памяти при возникновения исключения в конструкторе
class IScene{ public : virtual void Draw() const = 0; } class Scene: public IScene { /.../ }

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru