|
Программирование >> Инициализация объектов класса, структура
----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 & ); ... Член пространства имен можно определить и вне соответствующего пространства. В таком случае имя члена должно быть квалифицировано именами пространств, к которым он принадлежит. Например, если определение функции operator+() помещено в ----primer.C---- #include primer.h определение в глобальной области видимости cplusplus primer::MatrixLib::matrix cplusplus primer::MatrixLib::operator+ ( const matrix& ml, const matrix &m2 ) глобальную область видимости, то оно должно выглядеть следующим образом: { /* ... */ } Имя operator+() квалифицировано в данном случае именами пространств cplusplus primer и MatrixLib. Однако обратите внимание на тип matrix в списке параметров operator+() : употреблено неквалифицированное имя. Как такое может быть? В определении функции operator+() можно использовать неквалифицированные имена для членов своего пространства, поскольку определение принадлежит к его области видимости. При разрешении имен внутри функции operator+() используется MatrixLib. Заметим, однако, что в тине возвращаемого значения все же нужно указывать квалифицированное имя, поскольку он расположен вне области видимости, заданной определением функции: cplusplus primer::MatrixLib::operator+ В определении operator+() неквалифицированные имена могут встречаться в любом объявлении или выражении внутри списка параметров или тела функции. Например, локальное объявление внутри operator+() способно создать объект класса matrix: ---- primer.C ---- #include primer.h cplusplus primer::MatrixLib::matrix cplusplus primer::MatrixLib::operator+ ( const matrix &ml, const matrix &m2 ) объявление локальной переменной типа cplusplus primer::MatrixLib::matrix matrix res; вгчисим сумму двух объектов matrix return res; Хотя члены могут быть определены вне своего пространства имен, такие определения допустимы не в любом месте. Их разрешается помещать только в пространства, объемлющие данное. Например, определение operator+() может появиться в глобальной области видимости, в пространстве имен cplusplus primer и в ---- primer.C -- #include primer.h namespace cplusplus primer { MatrixLib::matrix MatrixLib::operator+ ( const matrix &ml, const matrix &m2 ) { /* ... */ } пространстве MatrixLib. В последнем случае это выглядит так: Член может определяться вне своего пространства только при условии, что ранее он был объявлен внутри. Последнее приведенное определение operator+() было бы namespace cplusplus primer { namespace MatrixLib { class matrix { /*...*/ }; следящее объявление не может быть пропущено matrix operator+ ( const matrix &ml, const matrix &m2 ); ... ошибочным, если бы ему не предшествовало объявление в файле primer.h: 8.5.5. ПОО и члены пространства имен Как уже было сказано, определение пространства имен может состоять из разрозненных частей и размещаться в разных файлах. Следовательно, член пространства разрешено объявлять во многих файлах. Например: 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 bool error state; они используются. 2. Определения этих членов помещают в исходный файл, содержащий реализацию:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |