Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 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 при этом меняется.
|