|
Программирование >> Инициализация объектов класса, структура
==> ! daddy daddy ( 3 ) lines match ! daddy ( 3 ) lines match Requested query: ! daddy ( 2 ) when the wind blows through her hair, it looks almost alive, ( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her, ( 5 ) she tells him, at the same time wanting him to tell her more. запрос ИЛИ , формулируемый с помощью оператора . Выводятся все строки, в которых встречается хотя бы одно из двух указанных слов: ==> fiery untamed fiery ( 1 ) lines match untamed ( 1 ) lines match fiery untamed ( 2 ) lines match Requested query: fiery untamed ( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her, ( 4 ) magical but untamed. Daddy, shush, there is no such thing, запрос И , формулируемый с помощью оператора &&. Выводятся все строки, где оба указанных слова встречаются, причем располагаются рядом. Сюда входит и случай, когда одно слово является последним в строке, а другое - первым в следующей: ==> untamed && Daddy untamed ( 1 ) lines match daddy ( 3 ) lines match untamed && daddy ( 1 ) lines match Requested query: untamed && daddy ( 4 ) magical but untamed. Daddy, shush, there is no such thing, Эти элементы можно комбинировать: fiery && bird shyly Однако обработка производится слева направо, и все элементы имеют одинаковые приоритеты. Поэтому наш составной запрос интерпретируется как fiery bird ИЛИ shyly, а не как fiery bird ИЛИ fiery shyly: ==> fiery && bird shyly fiery ( 1 ) lines match bird ( 1 ) lines match fiery && bird ( 1 ) lines match shyly ( 1 ) lines match fiery && bird shyly ( 2 ) lines match запрос НЕ , формулируемтй с помощью оператора !. Выводятся все строки, где не встречается указанное слово. Например, так формулируется отрицание запроса 1: Requested query: fiery && bird shyly ( 3 ) like a fiery bird in flight. A beautiful fiery bird, he tells her, ( 6 ) Shyly, she asks, I mean, Daddy, is there? Чтобы можно было группировать части запроса, наша система должна поддерживать скобки. Например: Pfiery && (bird shyly) выдает все вхождения fiery bird или fiery shyly1. результат исполнения этого запроса приведен в начале данного раздела. Кроме того, система не должна многократно отображать одну и ту же строку. 17.1. Определение иерархии классов В этой главе мы построим иерархию классов для представления запроса пользователя. NameQuery Shakespeare NotQuery ! Shakespeare OrQuery Shakespeare Marlowe Сначала реализуем каждую операцию в виде отдельного класса: AndQuery William && Shakespeare В каждом классе определим функцию-член eval() , которая выполняет соответствующую операцию. К примеру, для NameQuery она возвращает вектор позиций, содержащий координате! (номера строки и колонки) начала каждого вхождения слова (см. раздел 6.8); для OrQuery строит объединение векторов позиций обоих своих операндов и т. д. Таким образом, запрос i untamed fiery Примечание [O.A.5]: Нумера ция сносок сбита. состоит из объекта класса OrQuery, который содержит два объекта NameQuery в качестве операндов. Для простых запросов этого достаточно, но при обработке составных запросов типа Alice && Weeks 1 Напомним, что для упрощения реализации необходимо, чтобы между любыми двумя словами, включая скобки и операторы запроса, был пробел. В реальной системе такое требование вряд ли разумно, но мы полагаем, что для вводного курсе, каковым является наша книга, это вполне приемлемо. AndQuery OrQuery NameQuery ( Alice ) NameQuery ( Emma ) ( Emma ) AndQuery. Правым операндом AndQuery является объект NameQuery для слова Weeks. Nameery ( Weeks ) Но левый операнд - это объект OrQuery, предшествующий оператору &&. На его месте мог бы быть объект NotQuery или другой объект AndQuery. Как же следует представить операнд, если он может принадлежать к типу любого из четырех классов? Эта проблема имеет две стороны: необходимо уметь объявлять тип операнда в классах OrQuery, AndQuery и NotQuery так, чтобы с его помощью можно было представить тип любого из четырех классов запросов; какое бы решение мы ни выбрали в предыдущем случае, мы должны иметь возможность вызывать соответствующий классу каждого операнда вариант функции-члена eval() . Решение, не согласующееся с объектной ориентированностью, состоит в том, чтобы определить тип операнда как объединение и включить дискриминант, показывающий не объектно-ориентированное решение union op type { объединение не может содержать объекты классов с ассоциированн конструкторами NotQuery *nq; OrQuery *oq; AndQuery *aq; string *word; enum opTypes { Not query=1, O query, And query, Name query class AndQuery { public: ... private: * opTypes хранит информацию о фактических типах операндов запроса * op type - это сами операнды это сами операнды op type lop, rop; opTypes lop type, rop type; текущий тип операнда: Хранить указатели на объекта: можно и с помощью типа void*: возникает проблема. Данный запрос состоит из двух подзапросов: объекта OrQuery, содержащего объекты NameQuery для представления слов Alice и Emima, и объекта
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |