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