Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Zaochniki / 08_ns

.pdf
Скачиваний:
9
Добавлен:
13.02.2016
Размер:
247.17 Кб
Скачать

Пространства им¼н

(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 ;

 

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

Пространства им¼н

Соседние файлы в папке Zaochniki