Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections_rus.doc
Скачиваний:
31
Добавлен:
06.02.2016
Размер:
1.41 Mб
Скачать

4.2. Пример с перегрузкой операторов

Определим класс «Таблица», который будет иметь два перегруженных оператора индексирования. Один из которых: char* Table::operator[](int i)возвращает запись по номеру, другой -int& Table::operator[](char* pattern)- наоборот – номер по записи.

C++ text

Комментарии

#include <stdio.h>

Для внедрения вывода

#include <string.h>

Для манипуляции со сроками

class Table

{

int Value[100];

char Name[100][32];

100 имен, включающих 32 буквы каждое

int Size;

Размер таблицы

public:

Table() {Size=-1;};

Сначала таблица пустая:.Size=-1

void AddItem(char* name, int value);

Функция используется для добавления срок к таблице

void PrintOut();

Эта функция выдает таблицу на печать

int& operator[](char*);

Две перегрузки операции индексирования

char* operator[](int);

};

void Table::AddItem(char* name, int value)

{

Size++;

if (Size==100)

{

printf("\nTable overflow");

}

else if (Size<100)

{

strcpy(Name[Size],name);

Value[Size]=value;

}

}

void Table::PrintOut()

{

int i;

for (i=0; i<=Size; i++)

{

printf("\n%d %16s %d",i, Name[i], Value[i]);

}

}

char* Table::operator[](int i)

{

if (0<=i && i<=Size)

{

return Name[i];

}else{

printf("\nIndex %d is out of range",i);

return NULL;

}

}

int& Table::operator[](char* pattern)

{

int i;

for (i=0; i<=Size; i++) {

Этот цикл обеспечивает последовательный поиск

if (strcmp(pattern,Name[i])==0) {

в таблице и если шаблон найден,

return Value[i];

возвращается соответствующее значение

}

}

printf("\nIndex %s is out of range",pattern);

return Value[0];

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

}

Чтобы проверить этот класс, давайте заполним таблицу данными о типе пива и его рейтинге

Name

Value

0

Николаевский пивзавод "Янтарь"

4

1

Черниговский пивкомбинат "Десна"

5

2

ОАО "Львовская пивоварня

2

3

ЗАО "Сармат"

6

4

Донецкий пивоваренный завод

1

Переменный размер в этом примере имеет значение последнего индекса, то есть 4. В этом примере оператор индекса таблицы [2] вернет значение ОАО "Львовская пивоварня", оператор индекса таблицы [Николаевский пивзавод "Янтарь"] возвращает значение 4, оператор таблицы [5] приводит к ошибке "Index 5 вне диапазона" и, наконец, оператор таблицы ["Ace"] будет производить сообщение об ошибке "Индекс “Ace” вне диапазона".

Чтобы проверить этот класс может быть использована простая программа:

main()

{

Table CR;

“Table” – имя класса, “CR” имя объекта класса “Table”

int i;

CR.AddItem("Николаевский пивзавод Янтарь",4);

Заполните таблицу CR значениями

CR.AddItem("Черниговский пивкомбинат Десна" ,5);

CR.AddItem("ОАО Львовская пивоварня",2);

CR.AddItem("ЗАО "Сармат"",6);

CR.AddItem("Донецкий пивоваренный завод ",1);

CR.PrintOut();

распечатать содержимое таблицы CR на экран

i=CR["Донецкий пивоваренный завод "]; printf("\n%d",i);

i=CR["Николаевский пивзавод Янтарь"]; printf("\n%d",i);

i=CR["Ace"]; printf("\n%d",i);

printf("\n %s",CR[1]);

printf("\n %s",CR[3]);

printf("\n %s",CR[4]);

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]