Программирование >>  Дополнительные возможности наследования 

1 ... 43 44 45 [ 46 ] 47 48 49 ... 265


Объявления классов можно поместить в один файл с программой, но это не считается хорошим стилем программирования. В соглашении, которого придерживаются многие программисты, рекомендуется помещать объявление в (}к1Йл заголовка, имя которого обычно совпадает с именем файла программы, но в качестве расширения используются такие варианты, как , h, hp или . hpp. В этой книге для имен файлов заголовков используется расширение . hpp, но вам стоит выяснить предпочтения собственного компилятора.

Например, можно поместить объявление класса Cat в файл с именем CAT. hpp, а определение методов класса - в файл с именем CAT.срр. Затем нужно включить файл заголовка в код файла с расширением . срр. Для этого в начале профаммного кода в файле CAT. срр используется следующая команда:

#include Cat.hpp

Эта команда дает указание компилятору ввести содержимое файла CAT. hpp в данном месте профаммы. Результат выполнения команды include такой же, как если бы вы переписали с клавиатуры в это место программы полное содержимое соответствующего файла заголовка. Имейте в виду, что некоторые компиляторы чувствительны к регистру букв и требуют точного соответствия написания имен файла в директиве sinclude и на диске.

Зачем же нужно отделять файл заголовка с расширением . hpp от файла профаммы с расширением . срр, если мы все равно собираемся вводить содержимое файла заголовка назад в файл профаммы? Как показывает практика, большую часть времени клиентов вашего класса не волнуют подробности его выполнения. При чтении небольшого файла заголовка они получают всю необходимую информацию и могут игнорировать файл с подробностями выполнения этого класса. Кроме того, не исключено, что содержимое файла заголовка с расширением hpp вам захочется включить не в один, а в несколько файлов профамм.

Объявление класса сообщает компилятору, что представляет собой этот класс, какие данные он содержит и какими функциями располагает. Объявление класса называется его интерфейсом, поскольку оно сообщает пользователю, как взаимодействовать с классом. Интерфейс обычно хранится в файле с расширением hpp, который называется файлом заголовка.

Из определения функции компилятор узнает, как она работает. Определение функции называется выполнением метода класса и хранится в файле с расширением . срр. Подробности выполнения класса касаются только автора класса. Клиентам же класса, т.е. частям программы, использующим этот класс, не нужно знать, как выполняются функции.

Выполнение с нодстамвкоО

Можно выполнять подЬтановку методов с помощью ключевого слова inline точно так же, как это делалось с обычными функциями. Для этого ключевое слово inline нужно разместить перед типом возвращаемого значения. Например, определение подставляемой функции-члена GetWeightO имеет следующий вид:

inline int Cat:;GetWeigtrtt) {

return itsweight; возвращает переменную-член Weight >



Можно также поместить определение функции в объявление класса, что автоматически делает такую функцию подставляемой:

class Cat {

public:

int GetWeightO { return itsWeight; } подставляемая функция void SetWeight(int aWeight);

>;

Обратите внимание на синтаксис определения функции GetWeight(). Тело подставляемой функции начинается сразу же после объявления метода класса, причем после круглых скобок нет никакой точки с запятой. Подобно определению обычной функции, определение метода начинается с открывающей фигурной скобки и оканчивается закрывающей фигурной скобкой. Как обычно, пробелы значения не имеют, и то же самое определение можно записать несколько иначе:

class Cat {

public:

int GetWeightO const {

return itsWeight;

} подставляемая функция

void SetWeight(int aWeight);

>;

В листингах 6.6 и 6.7 вновь создается класс Cat, но в данном случае объявление класса содержится в файле CAT.hpp, а выполнение - в файле CAT. срр. Кроме того, в листинге 6.7 метод доступа к данным класса и метод Meow() являются подставляемыми.

Racniai I.B. ВВътваав вхвссв cat в фа1йв cat. hpp

2 3 4 5 6 7 8 9

10 11 12

#include <iostream.h>

class Cat

public:

Cat (int initialAge); -CatO;

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

void SetAge (int age) { itsAge = age;} подставляемая функция! void MeowO const { cout << Мяу.\п ;} подставляемая функция! private:

int itsAge;

>;



Яасшанг В.7. Выпмивиие шш Cat i фаРйв cat, срр

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

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

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

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

9: itsAge = initialAge;

10: }

12; Cat:: Cat() деструктор, не выполняет никаких действий 13: { 14: > 15:

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

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

IB: int mainO

19: {

20: Cat Frisky(5); 21; Frisky.MeowO;

22; cout << Frisky is a cat who is ;

23: cout Frisky.QetAgeO years old.\n ;

24: Frisky. MeowO;

25: Frisky.SetAge(7);

26: cout Now Frisky is ;

27: cout Frisky.GetAgeO years old.\n ;

2B: return 0;

29: >

*,. - Meow,

Frisky is a cat who is 5 years old. Meow.

Now Frisky is 7 years old.

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

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

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

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



1 ... 43 44 45 [ 46 ] 47 48 49 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика