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

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

Войти
Регистрация
Восстановить пароль
 
Юрий Ч
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 149
#1

Не объясните в чём разница между случаями - C++

06.06.2013, 16:55. Просмотров 423. Ответов 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
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
//---------------------------------------------------------------------------
 
// Так делать нельзя. Неопределенная структура 'X'. Рекурсивное определение.
 
class X {
    X x;
};
 
 
//---------------------------------------------------------------------------
 
 
// Так делать можно.
 
class X {
    X *x;
};
 
 
//---------------------------------------------------------------------------
 
 
class Date {
 
    private:
 
        int d, m, y;
        static Date default_date;   // Так делать можно, но непонятно почему. Вроде же как тоже рекурсия?
 
    public:
 
        Date(int dd = 0, int mm = 0, int yy = 0);
        static void setDefault(int dd, int mm, int yy);
 
};
 
 
//---------------------------------------------------------------------------
 
 
Date::Date(int dd, int mm, int yy) {
 
    d = dd ? dd : default_date.d;
    m = mm ? mm : default_date.m;
    d = yy ? yy : default_date.y;
 
}
 
 
//---------------------------------------------------------------------------
 
 
Date Date::default_date(16, 12, 1770);
 
 
//---------------------------------------------------------------------------
 
 
void Date::setDefault(int dd, int mm, int yy) {
 
    Date::default_date = Date(dd, mm, yy);
 
}
 
 
//---------------------------------------------------------------------------
В примере с классом Date. Есть статический член этого же типа. Вроде как идёт рекурсивное определение, но и компилятор и Страуструп говорят, что всё нормально тут. Не объясните в чём разница между случаями с

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//---------------------------------------------------------------------------
 
// Так делать нельзя. Неопределенная структура 'X'. Рекурсивное определение.
 
class X {
    X x;
};
 
// и
 
//---------------------------------------------------------------------------
 
class Date {
 
    private:
 
        int d, m, y;
        static Date default_date;   // Так делать можно, но непонятно почему. Вроде же как тоже рекурсия?
 
.....
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2013, 16:55     Не объясните в чём разница между случаями
Посмотрите здесь:

Объясните, в чём разница - C++
int u = 6 int *p = &u или int *p p = &u В чём тут разница? Тема: Указатели.

В чём разница между заголовками <c***> и <***.h>? - C++
Пробовал несколько несложных примеров применения обоих вариантов. Результат выполнения идентичен. Компилятор никаких предупреждений не...

В чём разница между процедурами и функциями ? - C++
Мне просто нужно будет выполнить одну и ту же операцию несколько раз, а сама операция включает в себя несколько вычислений , создание...

В чём разница между string и символьными массивами? - C++
Собсна какая тема, такой и вопрос. Если выразить его по-точнее, то в чём существенные плюсы того и другого в разных ситуациях? Изучаю С++...

Односвязный список: В чём разница между struct и class? - C++
После неудач работы с Vector, а так же отсутствия (Хотя, скорее всего, я просто плохо искал) хорошей русской документации по нему, решил...

В чём разница между динамической и статической линковкой библиотеки? - C++
В чём разница между динамической и статической линковкой библиотеки? Если можно с примером.

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.06.2013, 17:50     Не объясните в чём разница между случаями #2
Есть такое понятие, как неполный тип. Экземпляры таких типов нельзя создавать. Зато можно создавать указатели на такие типы(но такие указатели нельзя разыменовывать и т.д., зато можно применять к ним delete и это будет ub, для таких вещей был придуман boost::checked_delete), а также статические экземпляры таких типов(т.к. статические члены в классе лишь объявляются, затем может идти определение неполного типа, а затем определение статического члена).
Например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct Incomplete;
 
struct X
{
    static Incomplete a;  
    Incomplete *p;
};
 
/*
struct Incomplete
{
    int field;
};
*/
 
Incomplete X::a; //error: нельзя определить переменную с неполным типом
 
int main()
{
    X object;
    *object.p = X::a; //error: нельзя разыменовать указатель на неполный тип.
}
Если раскомментить определение Incomplete, то все благополучно скомпилится.
Юрий Ч
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 149
06.06.2013, 18:12  [ТС]     Не объясните в чём разница между случаями #3
Так

C++
1
static Date default_date;
Является не полным типом? Я так понимаю создаётся некий объект с полями int d, m, y, со статическими же функциями и этот некий объект затем разделяют все объекты типа Date? Об этом возможно где-то прочесть?
diagon
Higher
1928 / 1194 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
06.06.2013, 18:20     Не объясните в чём разница между случаями #4
Цитата Сообщение от Юрий Ч Посмотреть сообщение
Является не полным типом?
Ну, компилятор еще не закончил парсить текущий класс, поэтому считает его неполным.

Цитата Сообщение от Юрий Ч Посмотреть сообщение
Я так понимаю создаётся некий объект с полями int d, m, y, со статическими же функциями и этот некий объект затем разделяют все объекты типа Date? Об этом возможно где-то прочесть?
Про статические переменные у Страуструпа должно быть, ну и в гугле информации хватает.
ViktorKozlov
133 / 125 / 2
Регистрация: 13.12.2012
Сообщений: 293
06.06.2013, 18:36     Не объясните в чём разница между случаями #5
Юрий Ч,
В случае
C++
1
2
3
class X {
    X x;
};
Невозможно определить размер объекта X, т.к. он, в свою очередь, состоит из объекта X, а тот, в свою очередь, опять состоит из объекта X и т.д., то есть фактически размер получался бы бесконечным, поэтому так делать нельзя.
Что касается указателя и статических элементов, то размер указателя известен, а статическое поле не входит в объект и не влияет на его размер, поэтому нет причин, чтобы так было делать нельзя
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 18:47     Не объясните в чём разница между случаями
Еще ссылки по теме:

В чём разница между состояниями потока failbit и badbit? - C++
В чём разница между failbit и badbit? Если просто просматривать ошибку ввода в моём случае, то он всегда пишет failbit (в цикле вайл при...

Различные варианты инициализации указателя - в чём точная разница между ними? - C++
Немного непонятен один момент. Есть некий класс Statement (конструктор используется по умолчанию). Вот четыре различных записи...

Объясните в чем разница между Visual C++ и С++ и C++ Builder - C++
Объясните в чем разница между С++ Visual C++ и C++ Builder. Просто интересно для себя

В чём разница? - C++
Здрасьте. Здесь представлены два способа присвоения переменной A значения 10. Через конструктор: class random { public:...

C++ и C. В чём разница? - C++
Всем доброго времени суток. Недавно разбирал сортировки в с++. Написал быструю и слияние. Вроде бы работает нормально. Спустя некоторое...

(char)xx и '\xx' - в чём разница? - C++
День добрый. Просто любопытно, почему cout &lt;&lt; (char)число; и cout &lt;&lt; '\число'; часто дают разный результат?


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

Или воспользуйтесь поиском по форуму:
Юрий Ч
5 / 5 / 0
Регистрация: 16.05.2012
Сообщений: 149
06.06.2013, 18:47  [ТС]     Не объясните в чём разница между случаями #6
ViktorKozlov, Ну выходит, что статическое поле static Date default_date класса Date не содержит поля static Date default_date, иначе пошла бы рекурсия. Что-то типа того.

Добавлено через 1 минуту
В общем, статический класс static Date, не содержит поля static Date default_date, иначе была бы рекурсия.
Yandex
Объявления
06.06.2013, 18:47     Не объясните в чём разница между случаями
Ответ Создать тему
Опции темы

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