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

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


прецупрещеяне

Листинг 6.5 не компилируется!

RuGMDNi B.S. Пример шрриш св8ШШ811и1 цишерфе1с

2 3 4 5

Пример ошибки компиляции, связанной

с нарушениями соглашений интерфейса класса

Sinclude <iostream.h> для объекта cout

class Cat {

public:

Cat(int initialAge); CatO;

int GetAgeO const; метод доступа const void SetAge (int age); void MeowO; private: int itsAge;

>;

конструктор класса Cat Cat::Cat(int initialAge) {

ItsAge = initialAge;

cout Cat constructor\n ;

>

Cat;; CatO деструктор, который не выполняет никаких действий {

cout Cat destructor\n ;

>

функция GetAge объявлена как const, но мы нарушаем это условие! int Cat;:GetAge() const {

return (itsAge++); это нарушение соглашения интерфейса!

>

определение функции SetAge как открытого метода доступа к данным класса

void Cat::SetAge(int age) <

присваиваем переменной-члену itsAge значение переданного параметра age ItsAge = age;



44 45

46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

Определение метода Meow возвращает void параметров нет

используется для вывода на экран текста Meow

void Cat::Meow()

cout Meow.\n ;

демонстрирует различные нарушения

интерфейса, что приводит к ошибкам компиляции

int mainO

Cat Frisky; не соответствует объявлению Frisky. MeowO;

Frisky. BarkO; Нет, кошки не лают.

Frisky.itsAge = 7; переменная itsAge закрыта

return 0;

Как упоминалось выше, эта программа не компилируется. Поэтому и от-ш£у.. сутствуют результаты ее работы.

Эту программу было забавно писать, поскольку в нее специально закладывались ошибки.

В строке 11 GetAge О объявляется как функция доступа к данным-членам класса без права их изменения, на что указывает спецификатор const. Однако в теле функции GetAgeO, а именно в строке 32, выполняется прирашение переменной-члена itsAge. А поскольку этот метод объявлен как const, он не имеет права изменять значение переменной itsAge. Следовательно, во время компиляции профаммы на этой строке будет зафиксирована ошибка.

В строке 13 объявляется метод Meow(), в этот раз без использования ключевого слова const. И хотя такое упущение не является ошибкой, это далеко не лучший стиль профаммирования. Если учесть, что этот метод не должен изменять значения переменных-членов класса Cat, то его следовало бы определить со спецификатором const.

В строке 58 показано определение объекта класса Cat с именем Frisky. В этом варианте профаммы класс Cat имеет конструктор, который принимает в качестве параметра целочисленное значение. Это означает обязательность передачи парамефа заданного типа. Поскольку в строке 58 никакой параметр не передается, компилятор зафиксирует ошибку.

Если в классе объявляется какой-либо конструктор, компилятор в этом случае не станет предлагать со своей стороны никакого другого консачУКТОэай даже если определение объекта по форме не будет со-отвефвовать объявленному конструктору. В подобных случаях компилятор покажет сообщение об ошибке.

В строке 60 вызывается метод ВагкО. Этот метод вообще не был объяш1ен, следовательно, ни о каком его использовании и речи быть не может.



в строке 61 делается попытка присвоить переменной itsAge значение 7. Поскольку переменная itsAge относится к числу закрытых данных-членов, то при компиляции профаммы здесь будет зафиксировано покушение на частную собственность класса.

Почему уля отслеживания ошиОок лучше использовать компилятор

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

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

Где следдеш располагать в программе оОъявленпя классов U впределенпя метвдвв

Каждая функция, объявленная в классе, должна иметь определение. Определение также называется выполнением функции. Подобно другим функциям, определение метода класса состоит из заголовка и тела функции.

Определение должно находиться в файле, который компилятор может легко найти. Большинство компиляторов С++ предпочитают, чтобы такой файл имел расширение с или срр. В этой книге используется расширение срр, но вам стоит выяснить предпочтения собственного компилятора.

примечание

Многие компиляторы полагают, что файпы115а*сширением с содержат программы, написанные на языке С, а ф 1Йлы с расширением срр - профаммы на С++. Вы можете использовать любое расширение, но именно . срр сведет к минимуму возможные недоразумения в программах на С++.



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

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