![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| nikitao |
|
||||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 1 Всего: 26 |
Void,да, ты меня обыграл
Вот это уже интереснее,но тогда вопрос:Зачем использывать такой синтаксис.В таком случае мы не выигрываем ни в чем,а можем ли мы выиграть при таком вообще???(Мне приходит в голову только когда надо структуру или класс с одинаковым именем и разным содержанием в разных классах создать)
-------------------- Жизнь - печальная штука. |
||||
|
|||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Да ничего мы не выигрываем Впрочем, вот вполне разумный пример использования вложенных классов для скрытия реализации:
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Вот уж не знал, что так можно делать. Есть три вопроса. 1) Наверное, это эквивалентно предварительному объявлению класса? 2) Это в стандарте? 3) Где же такая фича описывается? Не встречал даже у страуструпа. --------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
| Void |
|
||||||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Похоже, что да. Компилируется и работает даже вот это:
Дело, судя по всему, в том, что указатель на неполный тип является полным типом.
Да. Точный пункт не укажу, упоминания равномерно размазаны по тексту.
Я тоже. За подробными объяснениями, наверное, лучше обратиться к гуру -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||||||
|
|||||||||
| Neitron |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
На самом деле, это все обыкновенное следствие.
О котором можно догадаться видимо. Класс и структура, являются производными от пространства имен А значит в них же можно объвлять новые типы, как и в простом пространстве. class Name; Всегда являлся обявлением класса, а если есть объявление то можно использовать указатель на этот тип, но не сам тип. Никто никогда не отменял этого
Видно что это ничем не отличается от
Более короткая запись. Это как, извините, за столь тривиальный пример, но когда в школе объясняли что молекулы отталкиваются при очень близком расстоянии, мы могли сами додуматься, что если применить силы большие чем силы отталкивания молекулы удалось бы соеденить. Это сообщение отредактировал(а) Neitron - 15.11.2005, 14:48 -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
||||
|
|||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
Хочу добавить, что упоминание о вложенных структурах есть например в 10.8
-------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| Earnest |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Не совсем. В глобальном скопе - да, а если это дело поместить внутрь класса, то в первом случае объявляется вложенный класс, а во втором случае компилятор считает, что class А - внешний. По крайней мере, MSVC так себя ведет. Так что, Void, твой пример из начала темы, работать не будет (компилироваться будет, но будут ошибки линкера - в MSVC!) - потому то классы A - разные. Что касается примера со списком указателей на неполный класс - то принцип простой: инстационируется только то, то реально используется. Поэтому все будет компилироваться и работать до тех, пока не потребуется обратиться внутрь класса A. -------------------- ... |
||||||
|
|||||||
| Void |
|
||||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Не будут. Будут ошибки компиляции. Посыпаю пеплом голову
-------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||||
|
|||||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ну да, конечно, это я поторопилась и забыла, что был еще код, использующий это класс(подумала, что уже пробовали скомпилировать и получилось). Но точно знаю, что такой фокус не прокатывает внутри класса. А жаль.
Тоже самое для friend: если написать friend class BBB, то в локальном скопе класса не прокатит за предварительное объявление вложенного класса. А хотелось бы. Интересно, это стандарт или частное поведение MSVC? -------------------- ... |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Похоже, стандарт. Comeau ругается аналогичным образом. Вот только до конкретных указаний я все никак дойти не могу. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Void, интересную штуку ты откопал.
А что это? В стандарте не нашел? --------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
А что тут странного. Обычная фишка языка. Компилятору всё-равно на что указатель, т.к. размер указателя для лубого класса имеет один и тот же размер. Суть в том, что толку от такой записи нет, если нет потом определения класса B. |
||||
|
|||||
| LPBOY |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 228 Регистрация: 12.7.2005 Репутация: 20 Всего: 20 |
Так дело в том что B неопределен!!
Почему тогда так не компилится?
--------------------
Каждый человек по-своему прав, а по-моему нет... |
|||
|
||||
| Daevaorn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Прально, В же не определен. А по поводу предыдущего куска, ты же нигде в коде не используешь B. Поэтому и предварительное объявление class B вполне нормально, но бесполезно, т.к. разыменовать указатель на B у тебя не получится. |
||||
|
|||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
LPBOY
Не забываем про существование объявлений. -------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |