Классы и операторы интерфейса программы запросов | |
---|---|
TextQuery | Класс, который читает указанный файл и создает карту поиска. Этот класс предоставляет функцию поиска query() , которая получает строковый аргумент и возвращает объект класса QueryResult , представляющий строки, в которых присутствует ее аргумент (см. раздел 12.3.2) |
QueryResult | Класс, содержащий результаты вызова функции query() (см. раздел 12.3.2) |
Query | Класс интерфейса, указывающий на объект типа, производного от класса Query_base |
Query q(s) | Связывает объект q класса Query с новым объектом класса WordQuery , содержащим строку s |
q1 & q2 | Возвращает объект класса Query , связанный с новым объектом класса AndQuery , который содержит объекты q1 и q2 |
q1 | q2 | Возвращает объект класса Query , связанный с новым объектом класса OrQuery , содержащим объекты q1 и q2 |
~q | Возвращает объект класса Query , связанный с новым объектом класса NotQuery , содержащим объект q |
Классы реализации программы запросов | |
Query_base | Абстрактный класс, базовый для классов запроса |
WordQuery | Класс, производный от класса Query_base , который ищет указанное слово |
NotQuery | Класс, производный от класса Query_base , представляющий набор строк, в которых указанный операнд Query отсутствует |
BinaryQuery | Абстрактный базовый класс, производный от класса Query_base , который представляет запросы с двумя операндами типа Query |
OrQuery | Класс, производный от класса BinaryQuery , который возвращает набор номеров строк, в которых присутствует хотя бы один из операндов |
AndQuery | Класс, производный от класса BinaryQuery , который возвращает набор номеров строк, в которых присутствуют оба операнда |
Упражнение 15.31. При условии, что s1
, s2
, s3
и s4
являются строками укажите, какие объекты создаются в следующих выражениях:
(a) Query(s1) | Query(s2) & ~ Query(s3);
(b) Query(s1) | (Query(s2) & ~ Query(s3));
(c) (Query(s1) & (Query(s2)) | (Query(s3) & Query(s4)));
15.9.2. Классы Query_base
и Query
Начнем реализацию с определения класса Query_base
:
//
//
class Query_base {
friend class Query;
protected:
using line_no = TextQuery::line_no; //
virtual ~Query_base() = default;
private:
//
virtual QueryResult eval(const TextQuery&) const = 0;
//
virtual std::string rep() const = 0;
};