![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Что-то я сейчас наткнулся на одну фичу С++ и обалдел... Так и должно быть?
Т.е. вложенный класс видит статические методы своего верхнего класса???? Это сообщение отредактировал(а) Дрон - 4.8.2005, 15:16 -------------------- Да. Именно так. |
|||
|
||||
| bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Ну, а почему бы и нет?
Открытый статик виден всем |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
Ну обычно-то к нему обращаешься как ClassName::StaticMember, а тут такая красота! Главное, что это решает некоторые ранее возникавшие проблемы -------------------- Да. Именно так. |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Но ведь дочерний класс находится внутри области видимости материнского. Значит при вызове ClassName::StaticMember, ClassName можно не указывать...
|
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Поправьте меня... ведь static - это указание компилятору на прикрепление чего-либо на уровне еденицы компилирования, то есть данного исходного файла. По моему здесь классы совсем не причем.
А или это такой прикол |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 10 Всего: 93 |
En_t_end
В данном случае получается, что вложенные классы выступают в роле пространств имён (namespace), что на мой взгляд довольно забавно. -------------------- Да. Именно так. |
|||
|
||||
| comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Но ведь каждый класс, если я правильно понимаю является пространством имен. Просто обращение к нестатическим членам без указания экземпляра запрещено. А с указанием экземпляра, так и нестатические члены вызываются через ::, например выполнить метод родителя:
|
|||
|
||||
| ManiaK |
|
|||
![]() Homo Sapience ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1145 Регистрация: 3.8.2004 Где: ИУ5-93 Репутация: 5 Всего: 29 |
Во-Во! Без всяких namespace'ов можно обходиться!.. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
ManiaK
Не совсем. ADL не работает с классами и это весьма важно.
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Лучше сказать, что у каждого класса есть собственная область видимости. Фишка в том как компилятор производит поиск имен. При вызове некоторой функции, компилятор ищет ее определение сначала в той области видимости, где она вызвана. Если не находит, то ищет в следующей области, которая содержит в себе первую и т.д. пока не дойдет до области видимости файла. Если и там не найдет - то ошибка. В твоем случае он ищет Method1() сначала в обл. видимости Class2::, т.к. не находит, то продолжает поиск в Class1::, где поиск успешно завершается. А когда вызываешь статические функции, например, из функции main, то поиск происходит в области видимости файла. Поэтому в этом случае вызов нужно уточнять Class1::Method1(). Это сообщение отредактировал(а) LPBOY - 6.8.2005, 13:33 --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| LPBOY |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
А если вот так, то ADL работает
Правда пока сам не понял в чем тут дело... Надо в Стандарте порыться... --------------------
Каждый человек по-своему прав, а по-моему нет... |
||||
|
|||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
LPBOY
Да, но в таком случае foo не является членом A, и мы не можем обратиться к нему как A::foo.
3.4.2 [basic.lookup.koenig]
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |