Страница:
172 из 357
1 Альтернативные Реализации
Пока описание открытой части класса и описание функций членов остаются неизменными, реализацию класса можно модифцировать не влияя на ее пользователей. Как пример этого расмотрим таблицу имен, которая использовалась в настольном калькуляторе в Главе 3. Это таблица имен:
struct name (* char* string; char* 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 тем, что это настоящий тип. Можно описать более чем одну
table, можно иметь указатель на table и т.д. Например:
#include «table.h»
table globals; table keywords; table* locals;
main() (* locals = new table; // ... *)
Вот реализация table::look(), которая использует линеный поиск в связанном списке имен name в таблице:
#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); *) *);
В структуру данных и конс
|< Пред. 170 171 172 173 174 След. >|