
Zaochniki / 08_ns
.pdf
Пространства им¼н
(namespaces)
Пространства им¼н

Проблема
В языке C только одна глобальная область видимости
Библиотека A: заголовочный файл liba.h
|
|
|
|
|
|
c l a s s O b j e c t { / |
. |
. . / } ; // |
3 d |
объект |
|
i n t |
show ( void ) ; |
// |
отображение |
3 d |
сцены |
i n t |
v e r s i o n = 3 ; |
|
|
|
|
|
|
|
|
|
|
Библиотека B: заголовочный файл libb.h
c l a s s |
O b j e c t { / |
. . . / } ; |
// |
элемент окна |
||
i n t show ( void ) ; |
// |
отображение |
îêíà |
|||
const |
char v e r s i o n |
= " 1 . 2 0 |
. 0 7 " ; |
|||
|
|
|
|
|
|
Программа пользователя
#i n c l u d e |
" l i b a . h" |
#i n c l u d e |
" l i b b . h" |
i n t main ( ) |
{ |
|
O b j e c t |
a ; |
// неоднозначность : какой Object ? |
show ( ) ; |
|
// неоднозначность : какая show ( ) ? |
return |
0 ; |
|
} |
|
|
|
|
|
Пространства им¼н

Решение проблемы методами C
Использование префиксов
Библиотека A: заголовочный файл liba.h
|
|
|
|
|
|
c l a s s gl3d_Object { / |
. |
. . / } ; // |
3 d |
объект |
|
i n t |
gl3d_show ( void ) ; |
// |
отображение |
3 d |
сцены |
i n t |
g l 3 d _ v e r s i o n = 3 ; |
|
|
|
|
|
|
|
|
|
|
Библиотека B: заголовочный файл libb.h
c l a s s |
win_Object { / |
. . . / |
} ; // |
элемент окна |
||
i n t win_show ( void ) ; |
// |
отображение |
îêíà |
|||
const |
char w i n _ v e r s i o n |
= " 1 |
. 2 0 . 0 7 " ; |
|||
|
|
|
|
|
|
Программа пользователя
#i n c l u d e |
" l i b a . h" |
#i n c l u d e |
" l i b b . h" |
i n t main ( ) {
gl3d_Object o1 ; win_Object w ;
|
gl3d_show ( ) ; |
win_show ( ) ; |
|
|
|
return 0 ; |
|
|
|
|
} |
|
|
|
|
|
|
Пространства им¼н |
|
|
|
|
|
|

Достоинства и недостатки подхода в стиле C
Достоинства:
работает (если префиксы уникальные);
не требует изменений в синтаксисе языка.
Недостатки:
код программы загромождается префиксами;
возникает проблема выборы короткого, но уникального префикса;
у пользователя нет возможности управлять именами.
Пространства им¼н

Решение проблемы методами C++
Использование пространств им¼н: описания
Библиотека A: заголовочный файл liba.h
namespace g l 3 d |
{ |
|
|
|
|
|
|
||
c l a s s O b j e c t |
{ / |
. . . / } ; // |
3 d |
объект |
i n t show ( void ) ; |
// отображение |
3 d |
сцены |
|
i n t v e r s i o n = 3 ; |
|
|
|
|
|
|
|
|
|
} ; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Библиотека B: заголовочный файл libb.h
namespace win |
{ |
|
|
|
|
||
c l a s s |
O b j e c t |
{ |
/ . . . / } ; |
// |
элемент окна |
||
i n t |
show ( void ) ; |
// |
отображение |
îêíà |
|||
i n t |
s t a t u s ( ) ; |
|
|
|
|
||
const |
char |
v e r s i o n |
= " 1 . 2 0 |
. 0 7 " ; |
} ;
Пространства им¼н

Решение проблемы методами C++
Использование пространств им¼н: определения
Библиотека A: файл liba.cpp
#i n c l u d e " l i b a . h"
g l 3 d : : O b j e c t : : O b j e c t ( )
{
// конструктор класса Object из
// |
пространства |
èì¼í |
g l 3 d |
} |
|
|
|
i n t g l 3 d : : show ( ) |
|
|
|
{ |
|
|
|
// |
функция show |
|
|
// |
пространства |
èì¼í |
g l 3 d |
} |
|
|
|
Пространства им¼н

Решение проблемы методами C++
Использование пространств им¼н: использование
Программа пользователя: использование оператора ::
#i n c l u d e " l i b a . h" |
|
|
||
|
|
|||
#i n c l u d e " l i b b . h" |
|
|
||
i n t show ( ) { |
/ просто |
функция |
show / } |
|
|
|
|
|
|
i n t main ( ) |
|
|
|
|
{ |
|
|
|
|
g l 3 d : : O b j e c t o1 ; |
|
|
||
win : : O b j e c t |
w ; |
|
|
|
g l 3 d : : show ( ) ; |
|
|
||
win : : show ( ) ; |
|
|
||
: : show ( ) ; |
/ или просто / |
show ( ) ; |
||
cout << |
gl3d : : v e r s i o n |
<< ' ' |
<< win : : v e r s i o n ; |
|
return |
0 ; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
Пространства им¼н

Объявление using
Импорт одного имени в текущую область видимости
Программа пользователя: объявление using
|
|
|
|
|
|
#i n c l u d e " l i b a . h" |
|
|
|
|
|
#i n c l u d e " l i b b . h" |
|
|
|
|
|
i n t show ( ) { / просто |
функция show / } |
||||
using g l 3 d : : O b j e c t ; |
// |
видно |
до конца файла |
||
i n t main ( ) |
|
|
|
|
|
{ |
|
|
|
|
|
using win : : show ; |
|
// видно до конца блока |
|||
O b j e c t o1 ; |
// èç g l 3 d |
|
|||
win : : O b j e c t w ; |
// указано явно |
||||
g l 3 d : : show ( ) ; |
// указано явно |
||||
show ( ) ; |
|
// ОШИБКА неоднозначность |
|||
win : : show ( ) ; |
// |
èç |
win |
|
|
: : show ( ) ; |
// глобальная |
||||
cout << |
gl3d : : v e r s i o n |
<< ' |
' << win : : v e r s i o n ; |
||
return |
0 ; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
Пространства им¼н

Директива using
Импорт всех имен в текущую область видимости
Программа пользователя: директива using
#i n c l u d e |
" l i b a . h" |
#i n c l u d e |
" l i b b . h" |
|
|
using namespace g l 3 d ; |
// видно до конца файла |
|||
i n t main ( ) |
|
// |
все имена из g l 3 d |
|
|
|
|
||
{ |
|
|
|
|
O b j e c t o1 ; |
// èç g l 3 d |
|||
win : : O b j e c t w ; |
// |
указано явно |
||
show ( ) ; |
|
// |
èç |
g l 3 d |
win : : show ( ) ; |
// |
èç |
win |
|
cout << |
v e r s i o n |
<< |
' ' |
<< win : : v e r s i o n ; |
return |
0 ; |
|
|
|
} |
|
|
|
|
Пространства им¼н

Конфликты имен
и их разрешение
Программа пользователя: несколько директив using
#i n c l u d e |
" l i b a . h" |
#i n c l u d e |
" l i b b . h" |
|
|
using namespace |
g l 3 d ; |
|
|
|
|
|
using namespace |
win ; |
|
|
|
|
|
i n t main ( ) |
|
|
|
|
|
|
{ |
|
|
|
|
|
|
O b j e c t |
o1 ; |
// Ошибка неоднозначность |
||||
win : : O b j e c t w ; |
// указано явно |
|
||||
show ( ) ; |
|
// Ошибка неоднозначность |
||||
g l 3 d : : show ( ) ; |
// |
èç |
g l 3 d |
|
|
|
|
|
|
|
|
|
|
s t a t u s ( ) ; |
// |
èç |
win , |
òàê |
êàê íåò â g l 3 d |
|
cout << |
gl3d : : v e r s i o n |
<< ' |
' << |
win : : v e r s i o n ; |
||
return |
0 ; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
Пространства им¼н