ПОО и члены пространства имен
Как уже было сказано, определение пространства имен может состоять из разрозненных частей и размещаться в разных файлах. Следовательно, член пространства разрешено объявлять во многих файлах. Например:
// 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, как и в случае такого объявления в глобальной области видимости.