![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| wpp |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 25.5.2003 Репутация: нет Всего: нет |
вывод компилятора:
В чем дело, не пойму |
||||
|
|||||
| Neitron |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 580 Регистрация: 3.10.2005 Где: Москва Репутация: 2 Всего: 5 |
-------------------- Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей. Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ |
|||
|
||||
| wpp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 25.5.2003 Репутация: нет Всего: нет |
Neitron Хм, а почему? Похоже я чего-то фундаментального не понимаю...
|
|||
|
||||
| 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 |
||||
|
|||||
| wpp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 25.5.2003 Репутация: нет Всего: нет |
Void Гений!!! Но почему class?
|
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Ну хочешь, напиши struct -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| nikitao |
|
|||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 1 Всего: 26 |
wpp
В С++ нет принципиальной разницы между структурами и классами.Их разница лишь в том что по умалчанию в структуре переменные открыты ,а в классе закрыты.Так что компилится и так и так (сам проверил) -------------------- Жизнь - печальная штука. |
|||
|
||||
| wpp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 25.5.2003 Репутация: нет Всего: нет |
nikitao
Void Народ! Раз уж Вы в регалиях |
|||
|
||||
| nikitao |
|
||||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 1 Всего: 26 |
Void,не так делать нельзя ,ибо компеляция этого кода может быть "случайностью" и при дальнейшей разработке приложения перестать работать.К примеру:
Замени на
У меня перестал после этого работать.В общем (ИМХО) лучше избегать таких конструкций без необходимости(а тут ее нет) -------------------- Жизнь - печальная штука. |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
wpp
"The C++ Standard Library" Йозуттиса, однозачно. Английский вариант можно найти в инете, а русский перевод - купить. Добавлено @ 20:21 nikitao Если на то пошло, при дальнейшей разработке может перестать работать что угодно -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| nikitao |
|
|||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 1 Всего: 26 |
Лично по моим представления о синтаксисе С++ вообще нельзя использовать ничего ,что не обьявлено выше(или там extern иногда нужен),а тут все полностью этому правилу противоречит.
wpp,это в смысле че почитать? Если да,то MSDN в руки или Страуструпа в зубы и постигай неведаное... -------------------- Жизнь - печальная штука. |
|||
|
||||
| wpp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 25.5.2003 Репутация: нет Всего: нет |
nikitao А как надо?
|
|||
|
||||
| nikitao |
|
|||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 1 Всего: 26 |
Void,ты мне обьясни почему этот код не компилится???(в смысле который вместо указателя сруктуру создает)
Добавлено @ 20:25 wpp,мне нравится как Neitron сделал(я бы тоже так сделал) -------------------- Жизнь - печальная штука. |
|||
|
||||
| Void |
|
||||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
Потому что Pics в точке инстанциирования std::list является неполным типом. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||||
|
|||||||
| wpp |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 25.5.2003 Репутация: нет Всего: нет |
Вообще не въезжаю, почему class или struct надо. В справочнике Шилдта, в подобных случаях, без них вроде обходится
nikitao Спасибо, Страуструп есть у меня. Объясняет он ужасно (IMHO). В кучу ничего из прочитанного собрать не удалось |
|||
|
||||
| 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. |