В следующей программе приведен пример использования namespace-инструкции. Она локализует имена, используемые для реализации простого класса счета в обратном направлении. В созданном здесь пространстве имен определяется класс counter, который реализует счетчик, и переменные upperbound и lowerbound, содержащие значения верхней и нижней границ, применяемых для всех счетчиков.

namespace CounterNameSpace {

 int upperbound;

 int lowerbound;

 class counter {

   int count;

  public:

   counter(int n) {

    if(n <= upperbound) count = n;

    else count = upperbound;

   }

   void reset(int n) {

    if(n <= upperbound) count = n;

   }

   int run() {

    if(count > lowerbound) return count--;

    else return lowerbound;

   }

 };

}

Здесь переменные upperbound и lowerbound, а также класс counter являются частью области видимости, определенной пространством имен CounterNameSpace.

В любом пространстве имен к идентификаторам, которые в нем объявлены, можно обращаться напрямую, т.е. без указания этого пространства имен. Например, в функции run(), которая находится в пространстве имен CounterNameSpace, можно напрямую обращаться к переменной lowerbound:

if(count > lowerbound) return count--;

Но поскольку инструкция namespace определяет область видимости, то при обращении к объектам, объявленным в пространстве имен, извне этого пространства необходимо использовать оператор разрешения области видимости. Например, чтобы присвоить значение 10 переменной upperbound из кода, который является внешним по отношению к пространству имен CounterNameSpace, нужно использовать такую инструкцию.

CounterNameSpace::upperbound = 10;

Чтобы объявить объект типа counter вне пространства имен CounterNameSpace, используйте инструкцию, подобную следующей.

CounterNameSpace::counter ob;

В общем случае, чтобы получить доступ к некоторому члену пространства имен извне этого пространства, необходимо предварить имя этого члена именем пространства и разделить эти имена оператором разрешения области видимости.

Рассмотрим программу, в которой демонстрируется использование пространства имен CounterNameSpace.

// Демонстрация использования пространства имен.

#include

using namespace std;

namespace CounterNameSpace {

 int upperbound;

 int lowerbound;

 class counter {

   int count;

  public:

   counter (int n) {

    if(n <= upperbound) count = n;

    else count = upperbound;

   }

   void reset (int n) {

    if(n <= upperbound) count = n;

   }

   int run() {

    if(count > lowerbound) return count--;

    else return lowerbound;

   }

 };

}

int main()

{

 CounterNameSpace::upperbound = 100;

 CounterNameSpace::lowerbound = 0;

 CounterNameSpace::counter ob1(10);

 int i;

 do {

  i = ob1.run();

  cout << i << " ";

 }while(i > CounterNameSpace :: lowerbound);

 cout << endl;

 CounterNameSpace::counter ob2(20);

 do {

  i = ob2.run();

  cout << i << " ";

 }while(i > CounterNameSpace::lowerbound);

 cout << endl;

 ob2.reset(100);

 CounterNameSpace::lowerbound = 90;

 do {

  i = ob2.run();

  cout << i << " ";

 }while(i > CounterNameSpace::lowerbound);

 return 0;

}

Обратите внимание на то, что при объявлении объекта класса counter и обращении к переменным upperbound и lowerbound используется имя пространства имен CounterNameSpace. Но после объявления объекта типа counter уже нет необходимости в полной квалификации его самого или его членов. Поскольку пространство имен однозначно определено, функцию run() объекта ob1 можно вызывать напрямую, т.е. без указания (в качестве префикса) пространства имен (ob1.run()).

Программа может содержать несколько объявлений пространств имен с одинаковыми именами. Это означает, что пространство имен можно разбить на несколько файлов или на несколько частей в рамках одного файла. Вот пример.

namespace NS {

 int i;

}

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги