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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск имен для объявлений членов класса, несоответствие теории практике 
V
    Опции темы
zim22
Дата 10.3.2009, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



В нижеприведенном примере тип переменной Money bal согласно книжке(цитаты из неё ниже привожу) должен быть double. Но он int.
Как это объяснить?

Name Lookup for Class Member Declarations
Names used in the declarations of a class member are resolved as follows:
  • 1. The declarations of the class members that appear before the use of the name are considered.
  • 2. If the lookup in step 1 is not successful, the declarations that appear in the scope in which the class is defined, and that appear before the class definition itself, are considered.
For example:

Код

  typedef double Money;
     class Account {
     public:
         Money balance() { return bal; } // uses global definition of Money
     private:
         // error: cannot change meaning of Money
         typedef int Money;
         Money bal;
         // ...
     };


Перевод из русского издания книги:
Поиск имён для объявлений членов класса.
Поиск имён, используемых в объявлениях членов класса, осуществляется в следующем порядке.
  • Сначала рассматриваются объявления членов класса, предваряющие имя.
  • Если имя не найдено, рассматриваются объявления той области видимости, в которой класс определён, т.е. распложенный непосредственно перед определением класса.



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


Кодофей
****


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

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



Цитата(zim22 @  10.3.2009,  16:33 Найти цитируемый пост)

typedef int Money; << А это как понимать?
Money bal;




--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 10.3.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



а это понимать так, что, согласно книге, повторный typedef приведёт к ошибке // error: cannot change meaning of Money
и опять же, согласно книге, поиск имени Money компилятор ищет от точки объявления и выше. но никак не ниже.
читайте второй пункт списка.


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


Шустрый
*


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

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



Цитата(zim22 @  10.3.2009,  18:42 Найти цитируемый пост)
согласно книге, повторный typedef приведёт к ошибке


А зачем все это нужно? Если все равно ошибка будет!

Получается здесь два Money - один как тип переменной bal, другой что возвращает balance
PM MAIL WWW ICQ   Вверх
mes
Дата 10.3.2009, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



перенесите 7ю строку (typedef ..) выше первого определения Money , иначе когда компилятор  доходит  до нее возникает коллизия типов. 

Это сообщение отредактировал(а) mes - 10.3.2009, 16:55


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


Кодофей
****


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

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



zim22, Я не в курсе что там в твоей книжке написано, но мне кажется что компилятор правильно поступил.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Fazil6
Дата 10.3.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



scope разный у тайпдефов. Причем реально Money balance() возвращает double, а Money bal реально int
Перенеси первый тайпдеф в класс и тогда получишь ошибку. 
А так не вижу особых проблем. По книге написано, что ищется выше - оно и ищется выше. 
PM MAIL   Вверх
zim22
Дата 10.3.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



спасибо, разобрался


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

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

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

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

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


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

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


 




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


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

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