Программирование >>  Инициализация объектов класса, структура 

1 ... 305 306 307 [ 308 ] 309 310 311 ... 395


void TextQuery::

display solution()

cout << \n

<< Requested query: << *query << \n\n ;

const set<short,less<short>,allocator> *solution = query->solution();

if ( ! solution->size() ) { cout << \n\t

<< Sorry, no matching lines were found in text.\n << endl;

set<short>::const iterator it = solution->begin(), end it = solution->end();

for ( ; it != end it; ++it ) { int line = *it;

пронумеруем строки с 1 ... cout << ( << line+1 << )

<< (*lines of text)[line] << \n;

cout << endl;

Упражнение 17.26

Нашему классу TextQuery не хватает возможности принимать аргументы, заданные пользователем в командной строке.

(a) Предложите синтаксис командной строки для нашей поисковой системы.

(b) Добавьте в класс необходимые данные и функции-члены.

(c) Предложите средства для работа: с командной строкой (см. пример в разделе 7.8). Упражнение 17.27

В качестве темы для рабочего проекта рассмотрите следующие усовершенствования нашей поисковой системы:

(a) Реализуйте поддержку, необходимую для представления запроса AndQuery в виде одной строки, например Motion Picture Screen Cartoonists .

(b) Реализуйте поддержку для ответа на запрос на основе вхождения слов не в строку, а в предложение.

(c) Реализуйте подсистему хранения истории, с помощью которой пользователь мог бы ссылаться на предыдущий запрос по номеру, возможно, комбинируя его с новым запросом.

(d) Вместо того чтобы показывать счетчик найденных и все найденные строки, реализуйте возможность задать диапазон выводимых строк для промежуточных вычислений и для окончательного ответа:

[ ==> John && Jacob && Astor



(1) John ( 3 ) lines match

(2) Jacob ( 3 ) lines match

(3) john && Jacob ( 3 ) lines match

(4) astor ( 3 ) lines match

(5) john && jacob && astor ( 5 ) lines match

Новая возможность: пусть пользователь укажет, какой запрос выводить пользователь вводит число ==> вывести? 3

Затем система спрашивает, сколько строк выводить при нажатии клавиши Enter выводятся все строки,

но пользователь может также ввести номер одной строки или диапазон О сколько (Enter выводит все, иначе введите номер строки или диапазон)



В большинстве реальных приложений на C++ используется открытое наследование от одного базового класса. Можно предположить, что и в наших программах оно в основном будет применяться именно так. Но иногда одиночного наследования не хватает, потому что с его помощью либо нельзя адекватно смоделировать абстракцию предметной области, либо получающаяся модель чересчур сложна и неинтуитивна. В таких случаях следует предпочесть множественное наследование или его частный случай - виртуальное наследование. Их поддержка, имеющаяся в C++, - основная тема настоящей главы.

18.1. Готовим сцену

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

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

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

Добавление объектов к сцене, их перемещение, игра с источниками освещения и геометрией - работа компьютерного художника. Наша задача - предоставить интерактивную поддержку для манипуляций с графом сцены на экране. Предположим, что в текущей версии своего инструмента мы решили воспользоваться каркасом приложений Open Inventor для C++ (см. [WERNECKE94]), но с помощью нодтинизации расширили его, создав собственные абстракции нужных нам классов. Например, Open Inventor располагает тремя встроенными источниками освещения, производными от

class SoSpotLight : public SoLight { ... }

class SoPointLight : public SoLight { ... }

абстрактного базового класса SoLight:

class SoDirectionalLight : public SoLight { ... }

Префикс So служит для того, чтобы дать уникальные имена сущностям, которые в области компьютерной графики весьма распространены (данный каркас приложений

18. Множественное и виртуальное

наследование



1 ... 305 306 307 [ 308 ] 309 310 311 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика