Материалы книги получены с http://www.itlibitum.ru/
Это еще не все
Конечно, только что описанная методика передачи имеет некоторые недостатки. Во-первых, производные классы не удается нормально инкапсулировать, поскольку их все приходится перечислять в интерфейсах диспетчерских функций базового класса. В сущности, чтобы не вводить код типа, видимый широкой публике, мы выставили на всеобщее обозрение все производные типы - не очень хороший компромисс. Во-вторых, что произойдет с оператором вроде +=? Если в программе встречается Integer+=Complex, результат будет иметь тип Complex, а мы пока не располагаем средствами для преобразования типа «на месте».
В главах 11 и 12 обе проблемы будут решены для гомоморфныхиерархий классов, хотя приведенные методики обобщаются и для других ситуаций (скажем, для упомянутой выше проблемы с классами Event/View). А пока лишь скажу, что описанные в этой главе приемы приносят непосредственную пользу в тех ситуациях, когда на первое место выходит быстродействие, а не инкапсуляция. Два перехода по v-таблицам почти всегда работают быстрее традиционных подходов.
Наконец, не удивляло ли вас то, как наши функции возвращали Number&?
Number& Integer::operator+(const Integer& n)
{
// Ниже приведен псевдокод
if (i + n.i слишком велико для int) {
return ЦелоеСПовышенной точностью
}
else return Integer(i + n.i);
}
Возвращение ссылок на переменную величину - дело опасное. Многие компиляторы пускают в расход возвращаемую величину до того, как вам удастся ее использовать. Выделение памяти под возвращаемый объект оператором new (вместо стека) решает проблему, поскольку величина заведомо остается жить после завершения функции. Но тогда возникают проблемы с управлением памятью - когда и как удалять возвращаемую величину? Чтобы решить ее, нам понадобится материал глав 11 и 12, а также одна из методик управления памятью (скажем, подсчет ссылок), рассматриваемых в последней части книги.
Итак, приведенной в этой главе информации хватит для решения простых проблем (например, связанных с событиями и видами), но она лишь закладывает основу для построения более общих решений.
Назад Содержание Далее
|