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




Вложенные пространства имен


Мы уже упоминали, что пользовательские пространства имен могут быть вложенными. Такие пространства применяются для дальнейшего структурирования кода нашей библиотеки. Например:

// ---- primer.h ----

namespace cplusplus_primer {

    // первое вложенное пространство имен:

    // матричная часть библиотеки

    namespace MatrixLib {

        class matrix { /* ... */ };

        const double pi = 3.1416;

        matrix operators+ ( const matrix &ml, const matrix &m2 );

        void inverse( matrix & );

        // ...

    }

    // второе вложенное пространство имен:

    // зоологическая часть библиотеки

    namespace AnimalLib {

        class ZooAnimal { /* ... */ };

        class Bear : public ZooAnimal { /* ... */ };

        class Raccoon : public Bear { /* ... */ };

        // ...

    }

}

Пространство имен cplusplus_primer содержит два вложенных: MatrixLib и AnimalLib.

cplusplus_primer предотвращает конфликт между именами из нашей библиотеки и именами из глобального пространства вызывающей программы. Вложенность позволяет делить библиотеку на части, в которых сгруппированы связанные друг с другом объявления и определения. MatrixLib содержит сущности, имеющие отношение к классу matrix, а AnimalLib– к классу ZooAnimal.

Объявление члена вложенного пространства скрыто в этом пространстве. Имя такого члена автоматически дополняется поставленными спереди именами самого внешнего и вложенного пространств.

Например, класс, объявленный во вложенном пространстве MatrixLib, имеет имя

cplusplus_primer::MatrixLib::matrix

а функция

cplusplus_primer::MatrixLib::inverse

Программа, использующая члены вложенного пространства cplusplus_primer::Matrix­Lib, выглядит так:

#include "primer.h"

// да, это ужасно...

// скоро мы рассмотрим механизмы, облегчающие

// использование членов пространств имен!

void func( cplusplus_primer::MatrixLib::matrix &m )

{

    // ...

    cplusplus_primer::MatrixLib::inverse( m );

    return m;




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