|
Программирование >> Инициализация объектов класса, структура
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. Множественное и виртуальное наследование
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |