Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 17.1. Использование пространства имен






1: #include < iostream>

2:

3: namespace Window

4: {

5: const int MAX_X = 30

6: const int MAX_Y = 40

7: class Рапе

8: {

9: public:

10: Pane();

11: ~Pane();

12: void size(int x, int у)

13: void move(int x, int у)

14: void show();

15: private:

16: static int cnt;

17: int x;

18: int у;

19: };

20: }

21:

22: int Window:: Pane:: cnt = 0;

23: Window:: Pane:: Pane(): x(0), y(0) { }

24: Windo:: Pane:: ~Pane() { }

25:

26: void Window;: Pane:: size(int x, int y)

27: {

28: if(x < Window:: MAX_X & & x > 0)

29: Pane;: x = x:

30: if(y < Window;; MAX_Y & & y > 0)

31: Pane:: y = y;

32: }

33: void Window;: Pane:: move(int x, int y)

34: {

35: if(x < Window:: MAX_X & & x > 0)

36: Pane:: x = x;

37: if(y< Window:: MAX_Y & & y > 0)

38: Pane:: y = y;

39: }

40: void Window:: Pane:: show()

41: {

42: std:: cout < < " x " < < Pane:: x;

43: std:: cout < < " y " < < Pane:: y < < std:: endl;

44: }

45:

46: int main()

47: {

48: Window:: Pane pane;

49:

50: pane.move(20, 20);

51: pane.show();

52:

53: return 0;

54: }

 

Результат:

x 20 y 20

 

Анализ: Обратите внимание, что класс Pane вложен в пространство имен Window. Поэтому при обращении к объектам класса Pane их имена дополняются идентификатором Window::.

Статическая переменная-член cnt, объявленная в строке 16 внутри класса Pane, определяется как обычно. Но при определении функции-члена Pane:: size() и обращениях к переменным-членам MAX_X и MAX_Y в строках 26-32 используется явное указание пространства имен. Дело в том, что статическая переменная-член определяется внутри класса Pane, а определения других функций-членов (это же справедливо для функции Pane:: move()) происходят как за пределами класса, так и вне тела пространства имен. Без явного указания пространства имен компилятор покажет сообщение об ошибке.

Обратите внимание также на то, что внутри определений функций-членов обращение к объявленным переменным-членам класса происходит с явным указанием имени класса: Pane:: x и Pane:: y. Зачем это делается? Дело в том, что у вас возникли бы проблемы, если функция Pane:: move() определялась бы следующим образом:

 

void Window:: Pane:: move(int x, int у)

{

if(x < Window:: MAX_X & & x > 0)

x = x;

if(у < Window:: MAX_Y & & у > 0)

У = У;

Platform:: move(x, у);

}

 

Ну что, догадались, в чем проблема? Опасность состоит в том, что компилятор в этом выражении никаких ошибок не заметит.

Источник проблемы заключается в аргументах функции. Аргументы x и у скроют закрытые переменные-члены x и у, объявленные в классе Pane, поэтому вместо присвоения значений аргументов переменным-членам произойдет присвоение этих значений самим себе. Чтобы исправить эту ошибку, необходимо явно указать переменные-члены класса:

Pane:: x = x;

Pane:: y = у;

 

Ключевое слово using

 

Ключевое слово using может использоваться и как оператор, и в качестве спецификатора при объявлении членов пространства имен, но синтаксис использования using при этом меняется.


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.006 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал