Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статический член класса типа самого класса, почему нет рекурсивного определения? 
V
    Опции темы
zim22
Дата 5.8.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Читаю "Язык программирования С++" Страуструпа (10.2.4 Static Members).
В одном из его примеров обратил внимание на определение в качестве статического члена переменной самого класса.
Код

class Date {
public:
  Date(int dd = 0) { 
    day = dd ? dd : today.day; 
  }
private:
  static Date today; // !!!
  int day;
};
Date Date::today(5);
Date d;

Я думал рекурсивное определение можно создать только с помощью указателей на тип класса...
Код

class Node {
  Node *next;
};

Переменная static Date today; тоже относится к ресурсивной категории? 
(по крайней мере, когда через дебаггер смотришь содержимое переменной Date d, то она[посредством переменной today] ссылается сама на себя)


Это сообщение отредактировал(а) zim22 - 5.8.2009, 19:49


--------------------
PM MAIL   Вверх
bsa
Дата 5.8.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



zim22, все очень просто. Статические переменные класса не влияют на размер объектов этого класса (они общие для класса - доступ к ним возможен без указания объекта). Поэтому никаких рекурсий не возникает.

Это сообщение отредактировал(а) bsa - 5.8.2009, 20:02
PM   Вверх
zim22
Дата 5.8.2009, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(bsa @  5.8.2009,  20:01 Найти цитируемый пост)
 Поэтому никаких рекурсий не возникает.

Мне не понятен ход мыслей.

Вот как я рассуждаю:  переменная today хоть и статическая, но она типа класса. Значит внутри неё должна содержаться информация о полях класса. А одно из этих полей есть статическая переменная самого класса. Как по мне - рекурсия.


--------------------
PM MAIL   Вверх
bsa
Дата 5.8.2009, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



то что ты написал, по контексту примерно равно (если бы такое было возможно):
Код
class MyClass
{
...
};

namespace MyClass {
extern MyClass today;
}
Т.е. today находится не внутри объекта класса. А при инстанцировании эта информация не используется.
PM   Вверх
mes
Дата 5.8.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  5.8.2009,  19:10 Найти цитируемый пост)
Вот как я рассуждаю:  переменная today хоть и статическая, но она типа класса. Значит внутри неё должна содержаться информация о полях класса. А одно из этих полей есть статическая переменная самого класса. Как по мне - рекурсия. 

угу, вот пример:

Код

Date d;
std::cout << d.today.today.today.today.day;


такой пример же не смущает ? :
Код

class A { void f() { A a; ... } }


Проблема рекурсии в том, что она мешает нам определить размер объекта, но так как статическая переменная не влияет на размер объекта, то никаких препятствий нет
smile

Это сообщение отредактировал(а) mes - 5.8.2009, 20:27


--------------------
PM MAIL WWW   Вверх
zim22
Дата 5.8.2009, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



bsa, изменю пример:
Код

class Date {
public:
  int day;  
  static Date today; // !!!
};
Date Date::today = Date();

int main() {
  Date::today.today.today.today.today.day = 99;
}

количество точек можно указывать бесконечное. как это объяснить?
***
Цитата(mes @  5.8.2009,  20:19 Найти цитируемый пост)
угу, вот пример:

mes, вы прочитали мои мысли smile

Это сообщение отредактировал(а) zim22 - 5.8.2009, 20:27


--------------------
PM MAIL   Вверх
mes
Дата 5.8.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(zim22 @  5.8.2009,  19:26 Найти цитируемый пост)
вы прочитали мои мысли smile

 smile тут на форуме и не такому научат  smile

Вот еще один пример на эту тему :
Код

struct A;

struct B
{
    static A a; // с нестатической такого не получится :)
};

struct A {  };

A B::a;


Добавлено @ 20:41
А вот и "официальное"  объяснение эффекта :
Цитата

 9.4.2  Static data members   

1 A static data member is not part of the subobjects of a class.   There
  is  only one copy of a static data member shared by all the objects of
  the class.

2 The declaration of a static data member in its class definition is not
  a  definition and may be of an incomplete type
 other than cv-qualified
  void.  A definition shall be provided for the static data member if it
  is used (_basic.def.odr_) in the program...


Это сообщение отредактировал(а) mes - 5.8.2009, 20:51


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0790 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.