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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обсуждение "Философия С++" книга Эккеля, Выяснение нюансов 
:(
    Опции темы
EvilsInterrupt
Дата 16.1.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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"

но на такое ругается компилятор и правильно! Но почему тогда автор пишет что объявлений может быть сколько угодно?
Самое прикольное, автор через несколько строчек создает тему "Проблема многократного объявления".

Вопрос о каких объявлениях в принципе С+, говорит автор ?
PM MAIL WWW ICQ Jabber   Вверх
zim22
Дата 16.1.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(EvilsInterrupt @  16.1.2010,  14:44 Найти цитируемый пост)
Решил выкладывать вопросы относительно  тех или иных ситуаций из книги Эккеля в одной теме.

мой тебе совет - закрой тему, пока не поздно.
если у тебя есть конкретный вопрос - создай отдельную тему для него.
***
год назад я тоже подобную тему создавал smile
ничего хорошего с этого не вышло
http://forum.vingrad.ru/forum/topic-244742...er-lippman.html

Это сообщение отредактировал(а) zim22 - 16.1.2010, 15:59


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


любитель
****


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

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



Цитата(EvilsInterrupt @  16.1.2010,  14:44 Найти цитируемый пост)
Но почему тогда автор пишет что объявлений может быть сколько угодно?

автор пишет "много объявлений", а Вы приводите "много определений".
 smile 



--------------------
PM MAIL WWW   Вверх
EvilsInterrupt
Дата 16.1.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



mes, 
>>автор пишет "много объявлений", а Вы приводите "много определений".
Пока писал ответ на ваше замечание, понял чего не понимаю. Спасибо ;)))
PM MAIL WWW ICQ Jabber   Вверх
vikrorpert
Дата 17.1.2010, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(EvilsInterrupt @ 16.1.2010,  16:33)
mes, 
>>автор пишет "много объявлений", а Вы приводите "много определений".
Пока писал ответ на ваше замечание, понял чего не понимаю. Спасибо ;)))

а что поняли?


_______________
список бесплатных прокси

Это сообщение отредактировал(а) vikrorpert - 22.5.2010, 10:18
PM MAIL   Вверх
EvilsInterrupt
Дата 17.1.2010, 14:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

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



2 vikrorpert:
на ваши:
>>а что поняли?

Дело в том, что во многих проектах на С++ почти всегда есть объявление и соглассованное ему определение(реализация). В случае переменных, т.е. реальных объектов еще и создание! Так вот вчера понял, что всегда считал конструкцию вида:

Код

struct A
{
  int a;
  float b;
};


считал не  определением, а объявлением! ;) Однако посмотрев на это как:

Код

struct A; // т.е. форварт это прототип

struct A // то это уже определение
{
  int a;
  float b;
};


то понял, что форвард это и есть объявление, которое как правило не пишут за  ненадобностью! Однако тем неменее мы привыкли к виду:
Код


int func1(int a, float b); // forward

int func1(int a, float b)  // определение
{
   return(a + b); // неявное FloatToInt
}


вот и я привык к подобной ситуации, потому и начал считать фактическое определение функции объявлением )))

Это сообщение отредактировал(а) EvilsInterrupt - 17.1.2010, 14:49
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 17.1.2010, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(EvilsInterrupt @  17.1.2010,  13:48 Найти цитируемый пост)
В случае переменных, т.е. реальных объектов еще и создание! 

для переменных определение и есть создание. объявление доступно только для переменных с внешним связыванием (extern)
http://www.cyberguru.ru/programming/cpp/cp...up2-page52.html

Цитата(EvilsInterrupt @  17.1.2010,  13:48 Найти цитируемый пост)
то понял, что форвард это и есть объявление

 smile 

Цитата(EvilsInterrupt @  17.1.2010,  13:48 Найти цитируемый пост)
вот и я привык к подобной ситуации, потому и начал считать фактическое определение функции объявлением )))

не понял хода мысли в этом предложение, но 
 forward и есть объявление
так как любое определение включает в себя объявление, потому принято "простое обьявление" называть предварительным обьявлением (к тому же больше соответствует задаче) 
forward declaration == предварительное объявление
smile


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


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 "Определением структуры" )))

ЗЫ:
Объект функции напомнил мне анекдот:
Программист перед тем как лечь спать у изголовья на тумбочку ставит два стакана, один с водой и один пустой. Вопрос: А зачем два-то ? Ответ: Один на случай если захочет пить, а другой на случай если не захочет!


PM MAIL WWW ICQ Jabber   Вверх
zim22
Дата 17.1.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

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



Цитата(EvilsInterrupt @  17.1.2010,  17:20 Найти цитируемый пост)
funct f1; // напрашивается создание объекта функции, хоть и глупо! )))

функтор называется.


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


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."

Т.е. при переводе попутаны термины! ;)

Мораль: если не знаете английского, все равно держите английский вариант.

пример:
Код

#include <iostream>
using namespace std;

int  func(int a, float b);
int  func(int a, float b);

int main()
{
  cout << func(1,2.3) << endl;
  return(0);
}

int func(int a, float b)
{
  return(a + b);
}


Подтверждает что два прототипа функции, если они совпадают вполне работают и компилятся! )

Добавлено через 7 минут и 20 секунд
>>функтор называется.
Читерство! ;)))
Подобное можно достичь путем класса и перегрузкой оператора круглые скобки. Чтобы объект вел себя как функция. Но по сути это же не объект функции!! ;)

Это сообщение отредактировал(а) EvilsInterrupt - 17.1.2010, 18:47
PM MAIL WWW ICQ Jabber   Вверх
mes
Дата 17.1.2010, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(EvilsInterrupt @  17.1.2010,  17:20 Найти цитируемый пост)
1) в случае структур, процесс использования для программиста состоит из : [возможное forward объявление] - <обязательная декларация> - создания объекта структуры
2) для функций, программист видит: [необязательное forward объявление] - <обязательная декларация> - создание объекта функции бессмысленно

Вы упустили один иы вариантов запихнув его часть в другой.
итак существует
1. объявление и определение функций
Код

void f ();  // объявление 
void f () { .. } // определение

2. объявление и определение классов и структур
Код

struct S;
class C ; // объявления
struct S {
};
class C {
}; // определения

3. объявление и определение переменных
Код

extern A a;
extern int i;
extern const int ci; //  // объявления

А а;
int i; 
extern const ci = 5; // определения

подробней по ссылке приведенной в предыдущем моем посте.

Добавлено @ 20:06
Цитата(EvilsInterrupt @  17.1.2010,  17:43 Найти цитируемый пост)
>>функтор называется.
Читерство! ;)))
Подобное можно достичь путем класса и перегрузкой оператора круглые скобки. Чтобы объект вел себя как функция. Но по сути это же не объект функции!! ;)

объекта функции в c++ нет, есть функциональный объект - объект класса с перегруженным операторм ().
для чего они выделены иы общего семейства объектов поймете когда поближе познакомитесь с шаблонами.. пока воспринимайте просто, что так принято.

Добавлено @ 20:11
Цитата(EvilsInterrupt @  17.1.2010,  17:43 Найти цитируемый пост)
Возникла мысль,  глянуть книгу на языке автора.

для начала не могли бы Вы сказать какого года книга (оригинал, не перевод)
Цитата(EvilsInterrupt @  17.1.2010,  17:43 Найти цитируемый пост)
Т.е. при переводе попутаны термины! ;)

в оригинале тоже..
:(

Это сообщение отредактировал(а) mes - 17.1.2010, 20:33


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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