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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Область видимости, вложенные классы 
:(
    Опции темы
Дрон
  Дата 4.8.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 10
Всего: 93



Что-то я сейчас наткнулся на одну фичу С++ и обалдел... Так и должно быть?

Код

#include <stdio.h>

class Class1
{
public:
     class Class2
     {
          void Test()
          {
                Method1();
          }           
     };

     static void Method1()
     {
          printf("123");
     }
};


Т.е. вложенный класс видит статические методы своего верхнего класса????

Это сообщение отредактировал(а) Дрон - 4.8.2005, 15:16


--------------------
Да. Именно так.
PM   Вверх
bel_nikita
Дата 4.8.2005, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Ну, а почему бы и нет? smile
Открытый статик виден всем


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 4.8.2005, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 10
Всего: 93



Цитата(bel_nikita @ 4.8.2005, 16:21)
Открытый статик виден всем

Ну обычно-то к нему обращаешься как ClassName::StaticMember, а тут такая красота!

Главное, что это решает некоторые ранее возникавшие проблемы smile


--------------------
Да. Именно так.
PM   Вверх
comcon1
Дата 4.8.2005, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Но ведь дочерний класс находится внутри области видимости материнского. Значит при вызове ClassName::StaticMember, ClassName можно не указывать...


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


Эксперт
****


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

Репутация: 1
Всего: 20



Поправьте меня... ведь static - это указание компилятору на прикрепление чего-либо на уровне еденицы компилирования, то есть данного исходного файла. По моему здесь классы совсем не причем.
А или это такой прикол smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
Дрон
Дата 5.8.2005, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 10
Всего: 93



En_t_end
В данном случае получается, что вложенные классы выступают в роле пространств имён (namespace), что на мой взгляд довольно забавно.


--------------------
Да. Именно так.
PM   Вверх
comcon1
Дата 5.8.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Но ведь каждый класс, если я правильно понимаю является пространством имен. Просто обращение к нестатическим членам без указания экземпляра запрещено. А с указанием экземпляра, так и нестатические члены вызываются через ::, например выполнить метод родителя:

Код

child_ptr->ParrentT::method();



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


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

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



Цитата
В данном случае получается, что вложенные классы выступают в роле пространств имён (namespace), что на мой взгляд довольно забавно.

Во-Во! Без всяких namespace'ов можно обходиться!..
PM MAIL WWW   Вверх
Void
Дата 6.8.2005, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



ManiaK
Не совсем. ADL не работает с классами и это весьма важно.
Код
class A {
public:
    class B { };
    static void foo(B) { }
};

namespace N {
    class B { };
    void foo(B) { }
}

int main() {
    A::B x;
    N::B y;
    foo(x); // ошибка 
    foo(y); // все нормально
}



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
LPBOY
Дата 6.8.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата
В данном случае получается, что вложенные классы выступают в роле пространств имён (namespace), что на мой взгляд довольно забавно.

Лучше сказать, что у каждого класса есть собственная область видимости.
Фишка в том как компилятор производит поиск имен.
При вызове некоторой функции, компилятор ищет ее определение сначала в той области видимости, где она вызвана. Если не находит, то ищет в следующей области,
которая содержит в себе первую и т.д. пока не дойдет до области видимости файла.
Если и там не найдет - то ошибка.
В твоем случае он ищет Method1() сначала в обл. видимости Class2::, т.к. не находит,
то продолжает поиск в Class1::, где поиск успешно завершается.

А когда вызываешь статические функции, например, из функции main, то поиск
происходит в области видимости файла. Поэтому в этом случае вызов нужно уточнять Class1::Method1().

Это сообщение отредактировал(а) LPBOY - 6.8.2005, 13:33
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
LPBOY
Дата 7.8.2005, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата

Не совсем. ADL не работает с классами и это весьма важно.


А если вот так, то ADL работает smile

Код

class A {
public:
    class B { };
    friend void foo(B) { }
};

namespace N {
    class B { };
    void foo(B) { }
}

int main() {
    A::B x;
    N::B y;
    foo(x); // все нормально 
    foo(y); // все нормально
}

Правда пока сам не понял в чем тут дело... Надо в Стандарте порыться...
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Void
Дата 7.8.2005, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



LPBOY
Да, но в таком случае foo не является членом A, и мы не можем обратиться к нему как A::foo.
Цитата(LPBOY @ 7.8.2005, 03:42)
Правда пока сам не понял в чем тут дело... Надо в Стандарте порыться...

3.4.2 [basic.lookup.koenig]
Цитата
When an unqualified name is used as the postfix-expression in a function call (5.2.2), other namespaces not considered during the usual unqualified lookup (3.4.1) may be searched, and namespace-scope friend function declarations (11.4) not otherwise visible may be found.
...
If T is a class type (including unions), its associated classes are: the class itself; the class of which it is a member, if any; and its direct and indirect base classes. Its associated namespaces are the namespaces in which its associated classes are defined



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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