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

       

ПОО и члены пространства имен


Как уже было сказано, определение пространства имен может состоять из разрозненных частей и размещаться в разных файлах. Следовательно, член пространства разрешено объявлять во многих файлах. Например:

// primer.h

namespace cplusplus_primer {

    // ...

    void inverse( matrix & );

}

// usel.C

#include "primer.h"

// объявление cplusplus_primer::inverse() в use1.C

// use2.C

#include "primer.h"

// объявление cplusplus_primer::inverse() в use2.C

Объявление cplusplus::inverse() в primer.h ссылается на одну и ту же функцию в обоих исходных файлах use1.C и use2.C.



Член пространства имен является глобальной сущностью, хотя его имя квалифицировано. Требование ПОО (правило одного определения, см. раздел 8.2) распространяется и на него. Чтобы удовлетворить этому требованию, программы, в которых используются пространства имен, обычно организуют следующим образом:

1.      Объявления функций и объектов, являющихся членами пространства имен, помещают в заголовочный файл, который включается в каждый исходный файл, где они используются.

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

namespace cplusplus_primer {

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

    // объявления функций

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

    extern void inverse( matrix & );

    // объявления объектов

    extern bool error_state;

}

2.      Определения этих членов помещают в исходный файл, содержащий реализацию:

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

#include "primer.h"

namespace cplusplus_primer {

    // определения функций

    void inverse( matrix & )

         { /* ... */ }

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

         { /" ... */ }

    // определения объектов

    bool error_state = false;

}

Для объявления объекта без его определения используется ключевое слово extern, как и в случае такого объявления в глобальной области видимости.



Содержание раздела