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




Определения пространства имен - часть 2


Последовательность

namespace namespace_name {

задает новое пространство, если имя namespace_name не совпадает с одним из ранее объявленных. В противном случае новые объявления добавляются в старое пространство.

Возможность разбить пространство имен на несколько частей помогает при организации библиотеки. Ее исходный код легко разделить на интерфейсную часть и реализацию. Например:

// Эта часть пространства имен

// определяет интерфейс библиотеки

namespace cplusplus_primer {

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

    const double pi = 3.1416;

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

    void inverse ( matrix & );

}

// Эта часть пространства имен

// определяет реализацию библиотеки

namespace cplusplus_primer {

    void inverse ( matrix &m )

        { /* ... */ }

    matrix operator+ ( const matrix &ml,     const matrix &m2 )

        { /* ... */ }

}

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

Еще более полезной для организации исходного кода библиотеки является возможность разделить определение одного пространства имен на несколько файлов: эти определения также объединяются. Наша библиотека может быть устроена следующим образом:

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

namespace cplusplus_primer {

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

   const double pi = 3.1416;

   matrix operator+ ( const matrix &m1, const matrix &m2 );

   void inverse( matrix & );

}

// ---- primer.C ----

#include "primer.h"

namespace cplusplus_primer {

    void inverse( matrix &m )

       { /* ... */ }

    matrix operator+ ( const matrix &m1, const matrix &m2 )

       { /* ... */ }

}

Программа, использующая эту библиотеку, выглядит так:

// ---- user.C ----

// определение интерфейса библиотеки

#include "primer.h"

void func( cplusplus_primer::matrix &m )

{

   //...

   cplusplus_primer: :inverse( m );

   return m;

}

Подобная организация программы обеспечивает модульность библиотеки, необходимую для сокрытия реализации от пользователей, в то же время позволяя без ошибок скомпилировать и связать файлы primer.C и user.C в одну программу.




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