![]() |
|
Модераторы: bsa |
![]()
|
|
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Всем, привет!
Решил выкладывать вопросы относительно тех или иных ситуаций из книги Эккеля в одной теме. Может кто-то тоже чтото недопонимает, как я и ему ответы тоже помогут. Автор пишет в 1 томе, на странице №186: >>Принцип единственного определения в С++: объявлений может быть сколько угодно, но определение может быть только одно! Противоречивость на мой взгляд, потому что если бы объявлений было бы разрешено объявлять сколь угодно в большом количестве, то была бы возможна след. ситуация: 1.h: struct A{ int a; char c; double d; }; 2.h: #include "1.h" 1.cpp: #include "1.h" #include "2.h" но на такое ругается компилятор и правильно! Но почему тогда автор пишет что объявлений может быть сколько угодно? Самое прикольное, автор через несколько строчек создает тему "Проблема многократного объявления". Вопрос о каких объявлениях в принципе С+, говорит автор ? |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
мой тебе совет - закрой тему, пока не поздно. если у тебя есть конкретный вопрос - создай отдельную тему для него. *** год назад я тоже подобную тему создавал ничего хорошего с этого не вышло http://forum.vingrad.ru/forum/topic-244742...er-lippman.html Это сообщение отредактировал(а) zim22 - 16.1.2010, 15:59 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
mes,
>>автор пишет "много объявлений", а Вы приводите "много определений". Пока писал ответ на ваше замечание, понял чего не понимаю. Спасибо ;))) |
|||
|
||||
| vikrorpert |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 3.1.2010 Репутация: нет Всего: нет |
а что поняли? _______________ список бесплатных прокси Это сообщение отредактировал(а) vikrorpert - 22.5.2010, 10:18 |
|||
|
||||
| EvilsInterrupt |
|
||||||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
2 vikrorpert:
на ваши: >>а что поняли? Дело в том, что во многих проектах на С++ почти всегда есть объявление и соглассованное ему определение(реализация). В случае переменных, т.е. реальных объектов еще и создание! Так вот вчера понял, что всегда считал конструкцию вида:
считал не определением, а объявлением! ;) Однако посмотрев на это как:
то понял, что форвард это и есть объявление, которое как правило не пишут за ненадобностью! Однако тем неменее мы привыкли к виду:
вот и я привык к подобной ситуации, потому и начал считать фактическое определение функции объявлением ))) Это сообщение отредактировал(а) EvilsInterrupt - 17.1.2010, 14:49 |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
для переменных определение и есть создание. объявление доступно только для переменных с внешним связыванием (extern) http://www.cyberguru.ru/programming/cpp/cp...up2-page52.html
не понял хода мысли в этом предложение, но forward и есть объявление так как любое определение включает в себя объявление, потому принято "простое обьявление" называть предварительным обьявлением (к тому же больше соответствует задаче) forward declaration == предварительное объявление |
||||
|
|||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
2 mes :
Ход мыслей поясню ))) Итак, 1) в случае структур, процесс использования для программиста состоит из : [возможное forward объявление] - <обязательная декларация> - создания объекта структуры 2) для функций, программист видит: [необязательное forward объявление] - <обязательная декларация> - создание объекта функции бессмысленно так вот: 1) форварды: struct A; // для структуры, можно сказать прототип структуры ))) int funct(); // для функции, в привычном смысле и в книгах "прототип функции" 2) обязательная декларация struct A { int a; } int funct() {std::cout << std::endl; } 3) Создание объекта A aobj1; funct f1; // напрашивается создание объекта функции, хоть и глупо! ))) >>не понял хода мысли в этом предложение, но Так вот, я настолько привык использовать структуры без форвард объявлений, что для меня реализация структуры п.2 стало "Объявлением структуры" ))) А создание п.3 "Определением структуры" ))) ЗЫ: Объект функции напомнил мне анекдот: Программист перед тем как лечь спать у изголовья на тумбочку ставит два стакана, один с водой и один пустой. Вопрос: А зачем два-то ? Ответ: Один на случай если захочет пить, а другой на случай если не захочет! |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
||||
|
||||
| EvilsInterrupt |
|
|||
|
Executables research ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1019 Регистрация: 14.7.2007 Где: Железнодорожный, МО, Россия Репутация: нет Всего: 9 |
Читаю в русской версии книги, том 1, слова автора:
"Языки С и С++ разрешают заново определять функции, если объявления совпадают, но ни один из них не разрешает заново определять структуры". Мозг убил, с вопросом : "А как это ? Всегда меня линкер посылал, а теперь значится по автору можно! Почему ?". Тут же на строгал пример и перепроверил, не пашет! Как и должно. Показал двум форумчанам, не воткнули, смысл их слов "забей". Третий качнул книгу, что читаю, почитал Страуструпа и тоже не воткнул, как это Эккель сам себе противоречит ? Возникла мысль, глянуть книгу на языке автора. Оказалось: "Both C and C++ allow you to redeclare a function, as long as the two declarations match, but neither will allow the redeclaration of a structure." Т.е. при переводе попутаны термины! ;) Мораль: если не знаете английского, все равно держите английский вариант. пример:
Подтверждает что два прототипа функции, если они совпадают вполне работают и компилятся! ) Добавлено через 7 минут и 20 секунд >>функтор называется. Читерство! ;))) Подобное можно достичь путем класса и перегрузкой оператора круглые скобки. Чтобы объект вел себя как функция. Но по сути это же не объект функции!! ;) Это сообщение отредактировал(а) EvilsInterrupt - 17.1.2010, 18:47 |
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Вы упустили один иы вариантов запихнув его часть в другой. итак существует 1. объявление и определение функций
2. объявление и определение классов и структур
3. объявление и определение переменных
подробней по ссылке приведенной в предыдущем моем посте. Добавлено @ 20:06 объекта функции в c++ нет, есть функциональный объект - объект класса с перегруженным операторм (). для чего они выделены иы общего семейства объектов поймете когда поближе познакомитесь с шаблонами.. пока воспринимайте просто, что так принято. Добавлено @ 20:11 для начала не могли бы Вы сказать какого года книга (оригинал, не перевод) в оригинале тоже.. :( Это сообщение отредактировал(а) mes - 17.1.2010, 20:33 |
||||||
|
|||||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |