Язык программирования C++ для профессионалов



           

Альтернативные реализации


Пока описание общей части класса и функций-членов остается неизменным, можно, не влияя на пользователей класса, менять его реализацию. В подтверждение этого рассмотрим таблицу имен из программы калькулятора, приведенной в лекции 3. Структура ее такова:

struct name { char* string; name* next; double value; };

А вот вариант класса table (таблица имен):

// файл table.h class table { name* tbl; public: table() { tbl = 0; }

name* look(char*, int = 0); name* insert(char* s) { return look(s,1); } };

Эта таблица отличается от определенной в лекции 3 тем, что это настоящий тип. Можно описать несколько таблиц, завести указатель на таблицу и т.д. Например:

#include "table.h"

table globals; table keywords; table* locals;

main() { locals = new table; // ... }

Приведем реализацию функции table::look(), в которой используется линейный поиск в списке имен таблицы:

#include <string.h>

name* table::look(char* p, int ins) { for (name* n = tbl; n; n=n->next) if (strcmp(p,n->string) == 0) return n; if (ins == 0) error("имя не найдено");

name* nn = new name; nn->string = new char[strlen(p)+1]; strcpy(nn->string,p); nn->value = 1; nn->next = tbl; tbl = nn; return nn; }

Теперь усовершенствуем класс table так, чтобы поиск имени шел по ключу (хэш-функции от имени), как это и было сделано в примере с калькулятором. Сделать это труднее, если соблюдать ограничение, требующее, чтобы не все программы, использующие приведенную версию класса table, надо было изменять:

class table { name** tbl; int size; public: table(int sz = 15); ~table();

name* look(char*, int = 0); name* insert(char* s) { return look(s,1); } };

Изменения в структуре данных и конструкторе произошли потому, что для хэширования таблица должна иметь определенный размер. Задание конструктора со стандартным значением параметра гарантирует, что старые программы, в которых не использовался размер таблицы, останутся верными. Стандартные значения параметров полезны в таких случаях, когда нужно изменить класс, не влияя на программы пользователей класса. Теперь конструктор и деструктор создают и уничтожают хэшированные таблицы:




Содержание  Назад  Вперед