С++ для начинающих



         

.Классы как члены пространства имен * - часть 2


int cplusplus_primer::List::ListItem::action() { }

Члены вложенного класса ListItem можно определить в пространстве имен cplusplus_primer, которое содержит определение List, или в глобальном пространстве, включающем определение cplusplus_primer. В любом случае имя члена в определении должно быть квалифицировано именами объемлющих классов и объявленных пользователем пространств, вне которых находится объявление члена.

Как происходит разрешение имени в определении члена, которое находится в объявленном пользователем пространстве? Например, как будет разрешено someVal:

int cplusplus_primer::List::ListItem::action() {

   int local = someVal;

   // ...

}

Сначала просматриваются локальные области видимости в определении функции-члена, затем поиск продолжается в области видимости ListItem, затем – в области видимости List. До этого момента все происходит так же, как в процессе разрешения имен, описанном в разделе 13.10. Далее просматриваются объявления из пространства cplusplus_primer  и наконец объявления в глобальной области видимости, причем во внимание принимаются только те, которые расположены до определения функции-члена action():

// --- primer.h ---

namespace cplusplus_primer {

   class List {

      // ...

   private:

      class ListItem {

      public:

         int action();

         // ...

      };

   };

   const int someVal = 365;

}

// --- primer.C ---

#include "primer.h"

namespace cplusplus_primer {

   int List::ListItem::action() {

      // правильно: cplusplus_primer::someVal

      int local = someVal;

      // ошибка: calc() еще не объявлена

      double result = calc( local );

      // ...

   }

   double calc(int) { }

   // ...

}

Определение пространства имен cplusplus_primer не является непрерывным. Определения класса List и объекта someVal размещены в первом его разделе, который находится в заголовочном файле primer.h. Определение функции calc() появляется в определении пространства имен, расположенном в файле реализации primer.C. Использование calc() внутри action() ошибочно, так как она объявлена после использования. Если calc() – часть интерфейса cplusplus_primer, ее следовало бы объявить в той части данного пространства, которая находится в заголовочном файле:




Содержание  Назад  Вперед