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

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

Восстановить пароль Регистрация
 
obuhanoe
23 / 21 / 2
Регистрация: 25.08.2010
Сообщений: 93
15.09.2010, 10:42     Класс в классе #1
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++ Класс в классе
У меня класс B в классе A, а в классе B рекурсивная функция переопределения оператора "()", как её вызвать, не создавая явно объект класса B? C++
Реализовать класс Account, представляющий собой банковский счет. В классе должны быть четыре поля 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
2293 / 1663 / 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
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.09.2010, 13:21     Класс в классе #6
Цитата Сообщение от Chevit Посмотреть сообщение
Это не относится к С++?
Да, относится, память таки подвела.
Деструктор будет просто объявлен и ничего делать не будет, а посему можно считать, что он и не генерится вовсе.
Цитата Сообщение от Chevit Посмотреть сообщение
В случае если деструктор не определен явно, при удалении объекта класса просто ничего не происходит?
При удалении объекта вызываются деструкторы его полей.
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 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
4924 / 2504 / 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
2796 / 1572 / 246
Регистрация: 03.05.2010
Сообщений: 3,647
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
2293 / 1663 / 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     Класс в классе
Еще ссылки по теме:

C++ Чем может быть чревато создание в классе адреса на другой класс
C++ Ошибка в выводе данных, класс выводит правильно, а класс в классе - нет
Как использовать вектор, содержащий указатели на класс, в этом же классе? C++

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

Или воспользуйтесь поиском по форуму:
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 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     Класс в классе
Ответ Создать тему
Опции темы

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