Читаем Освой самостоятельно С++ за 21 день. полностью

Возможность встраивания файлов в другие файлы позволяет хранить объявления классов отдельно от их выполнения и использовать тогда, когда в этом возникает необходимость. Это стандартный прием при создании программ на языке C++. Обычно объявления классов хранятся в файле с расширением .hpp, который затем включается в соответствующий файл .cpp с помощью директивы #include.

В строках 18—29 в точности повторяется тело функции main из листинга 6.4. Цель этого повторения — показать, что применение подставляемых вариантов функций не внесло изменений в использование этих функций.

Классы содержащие другие классы в качестве данных-членов

Нет ничего необычного в построении сложного класса путем объявления более простых классов и последующего включения их в объявление сложного класса. Например, можно объявить класс колеса, класс мотора, класс коробки передач и т.д., а затем объединить их в класс автомобиля. Тем самым объявляются и взаимоотношения между классами. Автомобиль имеет мотор, колеса и коробку передач.

Рассмотрим второй пример. Прямоугольник состоит из линий. Линия определяется двумя точками. Каждая точка определяется координатами x и у. В листинге 6.8 показано объявление класса Rectangle, которое содержится в файле RECTANGLE.hpp. Поскольку прямоугольник определяется четырьмя линиями, соединяющими четыре точки, и каждая точка имеет координаты на графике, то сначала будет объявлен класс Point для хранения координат x,y каждой точки. Листинг 6.9 содержит объявления обоих классов.

Листинг 6.8. Объявление классов точки и прямоугольника

1: // Начало файла Rect.hpp

2: #include

3: class Point // хранит координаты x,y

4: {

5:    // нет конструктора, используется конструктор по умолчанию

6: public:

7:    void SetX(int x) { itsX = x; >

8:    void SetY(int у) { itsY = у; }

9:    int GetX const < return itsX;}

10:   int GetY const { return itsY;}

11: private:

12:   int itsX;

13:   int itsY;

14: }; // конец объявления класса Point

15:

16:

17: class Rectangle

18: {

19: public:

20:   Rectangle(int top, int left, int bottom, int right):.;

21:   ~Rectangle {}

22:

23:   int GetTop const { return itsTop; }

24:   int GetLeft const { return itsLeft; }

25:   int GetBottom const { return itsBottom; }

26:   int GetRight const { return itsRight; }

27:

28:   Point GetUpperLeft const { return itsUpperLeft; }

29:   Point GetLowerLeft const { return itsLowerLeft; }

30:   Point GetUpperRight const { return itsUpperRight; }

31:   Point GetLowerRight const { return itsLowerRight; }

32:

33:   void SetUpperLeft(Point Location) {itsUpperLeft = Location; }

34:   void SetLowerLeft(Point Location) {itsLowerLeft = Location; }

35:   void SetUpperRight(Point Location) {itsUpperRight = Location; }

36:   void SetLowerRight(Point Location) {itsLowerRight = Location; }

37:

38:   void SetTop(int top) { itsTop = top; }

39:   void SetLeft (int left) { itsLeft = left; }

40:   void SetBottorn (int bottom) { itsBottom = bottom; }

41:   void SetRight (int right) { itsRight = right; }

42:

43:   int GetArea const;

44:

45: private:

46:   Point itsUpperLeft;

47:   Point itsUpperRight;

48:   Point itsLowerLeft;

49:   Point itsLowerRight;

50:   int itsTop;

51:   int itsLeft;

52:   int itsBottom;

53:   int itsRight;

54: };

55: // конец файла Rect.hpp


Листинг 6.9. Содержимое файла RECT.cpp

1: // Начало файла rect.cpp

2: #include "rect.hpp"

3: Rectangle::Rectangle(int top, int left, int bottom, int right)

4: {

5:    itsTop = top;

6:    itsLeft = left;

7:    itsBottom = bottom;

8:    itsRight = right;

9:

10:   itsUpperLeft.SetX(left);

11:   itsUpperLeft.SetY(top);

12:

13:   itsUpperRight.SetXtright);

14:   itsUpperRight.SetY(top);

15:

16:   itsLowerLeft.SetX(left);

17:   itsLowerLeft.SetY(bottom);

18:

19:   itsLowerRight.SetX(right);

20:   itsLowerRight.SetY(bottom);

21: }

22:

23:

24: // Вычисляем площадь прямоугольника, отыскивая его стороны

25: // определяем его длину и ширину, а затем перемножаем их

26: int Rectangle::GetArea const

27: {

28:   int Width = itsRignt - itsLeft;

29:   int Height = itsTop - itsBottom;

30:   return (Width >> Height);

31: }

32:

33: int main

34: {

35:   //инициализируем локальную переменную Rectangle

36:   Rectangle MyRectangle (100, 20, 50, 80 );

37:

38:   int Area = MyRectangle.GetArea;

39:

40:   cout  << "Area: " << Area  << "\n";

41:   cout  << "Upper Left X Coordinate:";

42:   cout  << MyRectangle.GetUpperLeft.GetX;

43:   return 0;

44: }


Результат:

Area: 3000

Upper Left X Coordinate: 20


Анализ: В строках 3-14 листинга 6.8 объявляется класс Point, который используется для хранения конкретных координат x,y на графике. В данной программе класс Point практически не используется. Однако в других методах рисования он незаменим.

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT