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

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

Войти
Регистрация
Восстановить пароль
 
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
#1

Класс в классе - C++

15.09.2010, 10:42. Просмотров 796. Ответов 13
Метки нет (Все метки)

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
class Date
{
  public:
          
 
           Date(int dd = 0, Month mm = Month(0), int year = 0);
           //Деструктор
           ~Date(){};
          
 
           //Класс исключений
           class Bad_date
           {
            public:
                    Bad_date(short);
                    string& viewing_ex();
            private:
                    string error;
           };
 
         
 
  private:
           int day, year;
           Month month;
           static Date default_date; // дата по умолчанию
};
нужен ли деструктор для class Bad_date или всю работу выполнит ~Date(){};
спасибо за ответы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2010, 10:42     Класс в классе
Посмотрите здесь:

C++ Класс в классе
Реализовать класс Account, представляющий собой банковский счет. В классе должны быть четыре поля C++
Класс в классе C++
C++ Чем может быть чревато создание в классе адреса на другой класс
Как использовать вектор, содержащий указатели на класс, в этом же классе? C++
Написать класс «массив» (В классе реализовать следующие методы: конструкторы (по умолчанию, с параметрами,) C++
Функция проверки состояния в классе, класс автомобилей, избежать ДТП C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Oleg_SK
5 / 5 / 2
Регистрация: 15.09.2010
Сообщений: 25
15.09.2010, 10:55     Класс в классе #2
AFAIK, у Bad_date должен быть свой деструктор.
Chevit
3 / 3 / 0
Регистрация: 06.07.2010
Сообщений: 18
15.09.2010, 11:49     Класс в классе #3
Если не прописать явно деструктор Bad_date - сработает деструктор по умолчанию. Все зависит от того, что ты хочешь сделать.
Более того, если у тебя нет в классе динамических элементов - деструктор по умолчанию вполне приемлем...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.09.2010, 11:54     Класс в классе #4
Цитата Сообщение от obuhanoe Посмотреть сообщение
нужен ли деструктор для class Bad_date или всю работу выполнит ~Date(){};
Для чего Вам деструктор в классе Bad_date, если он содержит только std::string?
Для Date деструктор также не нужен, ибо ему нечего делать.
Цитата Сообщение от Chevit Посмотреть сообщение
деструктор по умолчанию
Насколько я помню, автоматически генерятся только:
1. Конструктор по умолчанию.
2. Конструктор копирования.
3. Оператор присваивания.
Chevit
3 / 3 / 0
Регистрация: 06.07.2010
Сообщений: 18
15.09.2010, 12:22     Класс в классе #5
CyBOSSeR,
Если деструктор не задан в программе, то он будет автоматически сгенерирован компилятором для уничтожения соответствующих объектов. Все деструкторы, сгенерированные компилятором, имеют атрибут public;
Это не относится к С++?

В случае если деструктор не определен явно, при удалении объекта класса просто ничего не происходит?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.09.2010, 13:21     Класс в классе #6
Цитата Сообщение от Chevit Посмотреть сообщение
Это не относится к С++?
Да, относится, память таки подвела.
Деструктор будет просто объявлен и ничего делать не будет, а посему можно считать, что он и не генерится вовсе.
Цитата Сообщение от Chevit Посмотреть сообщение
В случае если деструктор не определен явно, при удалении объекта класса просто ничего не происходит?
При удалении объекта вызываются деструкторы его полей.
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,911
Завершенные тесты: 1
15.09.2010, 15:06     Класс в классе #7
Деструктор, созданный компилятором по умолчанию, вызывает деструкторы для каждого члена класса. Деструкторы фундаментальных типов ничего не делают, а вот про std::string такого не скажешь. Тем не менее, деструктор для std::string будет вызван при уничтожении Bad_date автоматически.
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
15.09.2010, 16:52  [ТС]     Класс в классе #8
По деструктору стало все понятно, возник еще вопрос
необходимо перегрузить ==
почему когда я пишу
C++
1
2
//Перегрузка == для сравнения двух дат
           bool operator== (Date&, Date&);
говорит что передавать необходимо 1 параметр, а как тогда сравнить значения?
fasked
Эксперт C++
 Аватар для fasked
4929 / 2509 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.09.2010, 17:05     Класс в классе #9
Цитата Сообщение от obuhanoe Посмотреть сообщение
говорит что передавать необходимо 1 параметр, а как тогда сравнить значения?
Вторым операндом является "текущий" объект. То есть объекта сравнивает себя с входным аргументом оператора ==.

Вот так может быть понятнее:
C++
1
2
3
bool operator== (const Date &w) const {
   return (this->day == w.day && this->month == w.month && this->year == w.year)
};
Кстати такой метод должен быть константным, как и аргумент метода
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
15.09.2010, 17:12  [ТС]     Класс в классе #10
fasked - спасибо , понял
Mr.X
Эксперт С++
 Аватар для Mr.X
3021 / 1677 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
15.09.2010, 18:36     Класс в классе #11
Цитата Сообщение от Nick Alte Посмотреть сообщение
Деструкторы фундаментальных типов ничего не делают
Может все-таки память освобождают?
Chevit
3 / 3 / 0
Регистрация: 06.07.2010
Сообщений: 18
15.09.2010, 18:53     Класс в классе #12
Существенно это только в том случае, если фундаментальные типы созданы в "куче"...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2297 / 1667 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.09.2010, 21:43     Класс в классе #13
Цитата Сообщение от Mr.X Посмотреть сообщение
Может все-таки память освобождают?
При чем здесь память? Деструктор не участвует в высвобождении памяти из под объекта, для которого он был вызван. И маловероятно, что у встроенных типов есть деструкторы, по крайней мере в привычном понимании.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2010, 11:27     Класс в классе
Еще ссылки по теме:

Класс: нужно в классе Animal сделать метод show (); C++
C++ Класс: нужно в классе Animal сделать метод show ();
C++ Не виден класс, объявленный в другом классе
Указатель в классе, указывающий на этот же класс C++
C++ Класс в классе

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1599 / 991 / 117
Регистрация: 27.09.2009
Сообщений: 1,911
Завершенные тесты: 1
16.09.2010, 11:27     Класс в классе #14
Это уже вопрос терминологии. В ряде случаев, особенно при работе с шаблонами, удобнее считать, что конструкторы и деструкторы есть у всех типов, но иногда они могут быть "пустыми" и ничего не делать.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template <typename T>
inline void Destroy(T& a)
{
    a.~T();
}
 
int main(int argc, char* argv[])
{
    int a;               // Для a вызывается конструктор int по умолчанию, который ничего не делает
    int b(1);           // Для b вызывается конструктор копирования
    a = int(2);        // Здесь a присваивается безымянное значение, созданное конструктором int
    Destroy(a);              // Так можно даже для аргумента типа int
//    a.~int();               // А вот так - нельзя
    return 0;
}
Yandex
Объявления
16.09.2010, 11:27     Класс в классе
Ответ Создать тему
Опции темы

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