Листинг 6.6. Объявление класса CAT в файле CAT.hpp



1: #include <iostream.h>

2: class Cat

3; {

4: public:

5: Cat (int initialAge);

6: ~Cat();

7: int GetAge() const { return itsAge;) // подставляемая функция!

8: void SetAge (int age) { itsAge = age;} // подставляемая функция!

9: void Meow() const { cout << "Мяу.\n";} // подставляемая функция!

10: private:

11: int itsAge;

12: };

 

Листинг 6.7. Выполнение масса Cat в файле CAT.cpp

1: // Пример использования подставляемых функций

2: // и включения файла заголовка

3:

4: #include "cat.hpp" // не забудьте включить файл заголовка!

5:

6:

7: Cat::Cat(int initialAge) //конструктор

8: {

9: itsAge = initialAge;

10: }

11:

12: Cat::~Cat() // деструктор, не выполняет никаких действий

13: {

14: }

15:

16: // Создаем виртуальную кошку, устанавливаем ее возраст, разрешаем

17: // ей мяукнуть, сообщаем ее возраст, затем снова "мяукаем" и изменяем возраст кошки.

18: int main()

19: {

20: Cat Frisky(5);

21: Frisky.Meow();

22: cout << "Frisky is а cat who is ";

23: cout << Frisky.QetAge() << " years old.\n";

24: Frisky.Meow();

25: Frisky.SetAge(7);

26: cout << "Now Frisky is " ;

27: cout << Frisky.GetAge() << " years old.\n";

28: return 0;

29: }

 

Результат:

Meow.

Frisky is а cat who is 5 years old.

Meow.

Now Frisky is 7 years old.

 

Анализ: Программа, представленная в листингах 6.6 и 6.7, аналогична программе из листинга 6.4 за исключением того, что три метода класса объявляются подставляемыми, а само объявление класса вынесено в файл заголовка CAT.hpp.

В строке 7 объявляется функция GetAge() и тут же следует определение ее выполнения. Строки 8 и 9 занимают объявления еще двух встроенных функций, но их определения содержатся в другом файле.

В строке 4 листинга 6.7 с помощью команды #include "cat.hpp" в программу включается содержимое файла CAT.hpp. Компилятор получает команду считать содержимое файла cat .hpp и ввести его в данный файл, начиная со строки 5.

Возможность встраивания файлов в другие файлы позволяет хранить объявления классов отдельно от их выполнения и использовать тогда, когда в этом возникает необходимость. Это стандартный прием при создании программ на языке 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 <iostream.h>

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

 


Дата добавления: 2019-02-12; просмотров: 222; Мы поможем в написании вашей работы!

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






Мы поможем в написании ваших работ!