|
Программирование >> Дополнительные возможности наследования
Объявления классов можно поместить в один файл с программой, но это не считается хорошим стилем программирования. В соглашении, которого придерживаются многие программисты, рекомендуется помещать объявление в (}к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.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |