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

5.3.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); *) *);

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

table::table(int sz) (* if (sz « 0) error(„отрицательный размер таблицы“); tbl = new name*[size=sz];

for (int i = 0; i«sz; i++) tbl[i] = 0; *)

table::~table() (* for (int i = 0; i«size; i++) for (name* n = tbl[i]; n; n=n-»next) (* delete n-»string; delete n; *) delete tbl; *)

Описав деструктор для класса name можно получить более простой и ясный вариант table::~table(). Функция просмотра практически идентична той, которая использовалась в примере настольного калькулятора (#3.1.3):

#include «string.h»

name* table::look(char* p, int ins) (* int ii = 0; char* pp = p; while (*pp) ii = ii««1 ^ *pp++; if (ii « 0) ii = -ii; ii %= size;

for (name* n=tbl[ii]; 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[ii]; tbl[ii] = nn; return nn;

*)

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

Почему, можете вы спросить, С++ разработан так, что поле изменения закрытой части необходима новая компиляция ползователей класса? И действительно, почему вообще закрытая часть должна быть представлена в описании класса? Другими словами, раз пользователям класса не разрешается обращаться к закрытым членам, почему их описания должны приводиться в зголовочных файлах, которые, как предполагается, пользователь читает? Ответ – эффективность. Во многих системах и процесс компиляции, и последовательность операций, реализующих вызов функции, проще, когда размер автоматических объектов (объетов в стеке) известен во время компиляции.

Этой сложности можно избежать, представив каждый объект класса как указатель на «настоящий» объект. Так как все эти указатели будут иметь одинаковый размер, а размещение «настящих» объектов можно определить в файле, где доступна закртая часть, то это может решить проблему. Однако решение поразумевает дополнительные ссылки по памяти при обращении к членам класса, а также, что еще хуже, каждый вызов функции с автоматическим объектом класса включает по меньшей мере один вызов программ выделения и освобождения свободной памяти. Это сделало бы также невозможным реализацию inline-функций члнов, которые обращаются к данным закрытой части. Более того, такое изменение сделает невозможным совместную компоновку C и С++ программ (поскольку C компилятор обрабатывает struct не так, как это будет делать С++ компилятор). Для С++ это было сочтено неприемлемым.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

7.3 Альтернативные Интерфейсы

Из книги C++ автора Хилл Мюррей

7.3 Альтернативные Интерфейсы После того, как описаны средства языка, которые относяся к производным классам, обсуждение снова может вернуться к стоящим задачам. В классах, которые описываются в этом раздле, основополагающая идея состоит в том, что они однажды нписаны, а


Альтернативные программы

Из книги Знакомства и общение в Интернете автора Леонтьев Виталий Петрович

Альтернативные программы Разумеется, одной «аськой» поголовье интернет-пейджеров не ограничивается – сегодня в мире существует более десятка аналогичных программ. Как правило, «пейджеры» не совместимы друг с другом – у каждого из них своя сфера интересов и база


Альтернативные блоги

Из книги Запись CD и DVD: профессиональный подход автора Бахур Виктор

Альтернативные блоги Каким бы распрекрасным и суперзамечательным не был «Живой Журнал», сколько бы знаменитостей не размещали на его странцах свои мысли по поводу и без, а все же назвать ЖЖ незаменимым и единственным в своем роде язык не поворачивается. И по совершенно


Глава 12 Альтернативные программы

Из книги Работа в Интернете автора Макарский Дмитрий

Глава 12 Альтернативные программы • EasyBoot.• Меню.• Файл.• Roxio Easy DVD Copy.• Ashampoo CD Recording Suite


Альтернативные средства поиска

Из книги Linux-сервер своими руками автора Колисниченко Денис Николаевич

Альтернативные средства поиска Несмотря на то что в сегодняшнем Интернете поисковые серверы являются главным способом поиска информации, существуют и другие методы ее поиска. Такие альтернативные способы порой помогают найти то, что не удалось отыскать с помощью


Альтернативные почтовые программы

Из книги Создание электронных книг в формате FictionBook 2.1: практическое руководство [Release 1.01 от 28.II.2010 г.] автора Кондратович Михаил Иосифович

Альтернативные почтовые программы Хотя Outlook Express достаточно проста в настройке и использовании, она все же предоставляет меньше возможностей, чем некоторые другие программы ее класса. Возможности подобных почтовых клиентов также самые разные: от мощных


Альтернативные клиенты ICQ

Из книги Asterisk™: будущее телефонии Второе издание автора Меггелен Джим Ван

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


8.8.2. Альтернативные серверы Socks5

Из книги 500 лучших программ для Windows автора Уваров Сергей Сергеевич

8.8.2. Альтернативные серверы Socks5 В качестве альтернативы серверу socks5 вы можете использовать прокси-сервер dante-socks, который доступен по адресу http://www.inet.no/dante/. Данный сервер использует файл конфигурации sockd.conf (см. листинг 8.14).Листинг 8.14. Файл /etc/sockd.conf internal: 192.168.0.1 port = 1080 external:


§ 4.9 Альтернативные средства редактирования

Из книги Инфраструктуры открытых ключей автора Полянская Ольга Юрьевна

§ 4.9 Альтернативные средства редактирования Говоря о редактировании FB2-книг, несправедливо было бы не упомянуть об   разработках, существующих, так сказать, в параллельной плоскости.Book Designer 4.0В первую очередь, это Book Designer В. Войцеховича и его специальная версия для FB2 — FB


Альтернативные аргументы make

Из книги Работа в Интернете. Энциклопедия автора Ташков Петр Андреевич

Альтернативные аргументы make Существует еще несколько дополнительных аргументов make, которые могут передаваться во время компиляции. Некоторые из них обсуждаются здесь, но остальные используются внутри файла и на самом деле не имеют никакого значения или практической


Альтернативные установки

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

Альтернативные установки AsteriskNOW можно также испытать, используя образ VMware Player (http://www.vmware.com/download/player/), универсальный образ гостевого домена Xen (http:// wiki.rpath.com/wiki/Xen_Solutions_Using_ rPath_Technologies) или LiveCD (только что записанного и запущенного). Все альтернативные установки можно найти на


Альтернативные интерфейсы

Из книги автора

Альтернативные интерфейсы Стандартный интерфейс операционной системы Windows всегда был для сторонних программистов примером неудачного оформления. Невзрачная цветовая гамма и отсутствие каких-либо визуальных эффектов привели к появлению на рынке программного


Альтернативные форматы сертификатов

Из книги автора

Альтернативные форматы сертификатов Помимо сертификатов открытых ключей формата X.509 v3 существуют сертификаты и других форматов. Остановимся на сертификатах SPKI, PGP, SET и атрибутных


Альтернативные средства поиска

Из книги автора

Альтернативные средства поиска Несмотря на то что в сегодняшнем Интернете поисковые серверы являются главным способом поиска информации, существуют и другие методы ее поиска. Такие альтернативные способы порой помогают найти то, что не удалось отыскать с помощью


Альтернативные клиенты ICQ

Из книги автора

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


Альтернативные подсистемы

Из книги автора

Альтернативные подсистемы Кроме подсистемы Windows, операционная система Windows XP поддерживает и другие подсистемы. Например, к поддерживаемым ею подсистемам относится Posix. Она очень редко применяется пользователями и тем не менее постоянно отбирает некоторый объем