Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Поиск имен для объявлений членов класса


Автор: zim22 10.3.2009, 16:33
В нижеприведенном примере тип переменной 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;
         // ...
     };


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

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

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


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

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


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

Получается здесь два Money - один как тип переменной bal, другой что возвращает balance

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

Автор: andrew_121 10.3.2009, 16:57
zim22, Я не в курсе что там в твоей книжке написано, но мне кажется что компилятор правильно поступил.

Автор: Fazil6 10.3.2009, 17:18
scope разный у тайпдефов. Причем реально Money balance() возвращает double, а Money bal реально int
Перенеси первый тайпдеф в класс и тогда получишь ошибку. 
А так не вижу особых проблем. По книге написано, что ищется выше - оно и ищется выше. 

Автор: zim22 10.3.2009, 17:23
спасибо, разобрался

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)