Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 6.5. Пример нарушения соглашений интерфейса






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

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

3:

4: #include < iostream.h> // для объекта cout

5:

6: class Cat

7: {

8: public:

9: Cat(int initialAge);

10: ~Cat();

11: int GetAge() const; // метод доступа const

12: void SetAge (int age);

13: void Meow();

14: private:

15: int itsAge;

16: };

17:

18: // конструктор класса Cat

19: Cat:: Cat(int initialAge)

20: {

21: itsAge = initialAge;

22: cout < < " Cat constructor\n";

23: }

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

25: {

26: cout < < " Cat destructor\n";

27: }

28: // функция GetAge объявлена как const,

29: // но мы нарушаем это условие!

30: int Cat:: GetAge() const

31: {

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

33: }

34:

35: // определение функции SetAge как открытого

36: // метода доступа к данным класса

37:

38: void Cat:: SetAge(int age)

39: {

40: // присваиваем переменной-члену itsAge

41: // значение переданного парйметра age

42: itsAge = age;

43: }

44:

45: // Определение метода Meow

46: // возвращает void

47: // параметров нет

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

49: void Cat:: Meow()

50: {

51: cout < < " Meow.\n";

52: }

53:

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

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

56: int main()

57: {

58: Cat Frisky; // не соответствует обьявлению

59: Frisky.Meow();

60: Frisky.Bark(); // Нет, кошки не лают.

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

62: return 0;

63: }

 

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

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

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

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

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

 

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

 

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

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

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.