|
Материалы книги получены с http://www.itlibitum.ru/
Проблемы
Прежде всего, в глаза бросаются все эти void*. И вы, и я прекрасно знаем, что на самом деле за ними кроется нечто совершенно иное. Где-то в клиентском коде придется сделать что-нибудь подобное:
for (ListNode* n = listHead; n != NULL; n = n->Next())
f((Foo*)n->Data());
Иначе говоря, вам придется постоянно приводить void* к конкретному типу Но как убедиться в том, что полученный указатель действительно имеет тип Foo*? Здесь придется рассчитывать только на себя, потому что компилятор со словами «Надеюсь, ты знаешь, что делаешь» умывает руки. Допустим, вы уверены, что ваше использование класса надежно по отношению к типам. Но можно ли гарантировать, что другой программист не выкинет какую-нибудь глупость и не занесет в коллекцию объект другого типа? Если вы свято верите в это, я рекомендую держаться подальше от рискованных
инвестиций и вложить деньги в правительственные бумаги, вряд ли вам повезет в этой жизни.
Вторая проблема заключается в том, что элементы списка не знают, на какой тип они указывают. Предположим, вам хочется, чтобы деструктор списка удалял не только сами узлы, но и данные, на которые они ссылаются. Нельзя передать оператору delete указатель void* и надеяться, что он сам выберет нужный деструктор.
Назад Содержание Далее
|