С++ для начинающих



         

Виртуальный ввод/вывод - часть 2


fiery && bird || shyly

пользователь ищет вхождения пары слов

fiery bird

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

shyly

С другой стороны, запрос

fiery && ( bird || hair )

найдет все вхождения любой из пар

fiery  bird

или

fiery hair

Если наши реализации print() не будут показывать скобки в исходном запросе, то для пользователя они окажутся почти бесполезными. Чтобы сохранить эту информацию, введем в наш абстрактный базовый класс Query два нестатических члена, а также функции доступа к ним (подобное расширение класса – естественная часть эволюции иерархии):

class Query {

public:

     // ...

     // установить _lparen и _rparen

           void lparen( short lp ) { _lparen = lp; }

           void rparen( short rp ) { _rparen = rp; }

     // получить значения_lparen и _rparen

           short lparen() { return _lparen; }

           short rparen() { return _rparen; }

     // напечатать левую и правую скобки

           void print_lparen( short cnt, ostream& os ) const;

           void print_rparen( short cnt, ostream& os ) const;

protected:

     // счетчики левых и правых скобок

           short _lparen;

           short _rparen;

     // ...

};

_lparen – это количество левых, а _rparen – правых скобок, которое должно быть выведено при распечатке объекта. (В разделе 17.7 мы покажем, как вычисляются такие величины и как происходит присваивание обоим членам.) Вот пример обработки запроса с большим числом скобок:

==> ( untamed || ( fiery || ( shyly ) ) )

evaluate word: untamed

_lparen: 1

_rparen: 0

evaluate Or

_lparen: 0

_rparen: 0

evaluate word: fiery

_lparen: 1

_rparen: 0

evaluate 0r

_lparen: 0

_rparen: 0

evaluate word: shyly

_lparen: 1

_rparen: 0

evaluate right parens:

_rparen: 3

( untamed ( 1 ) lines match

( fiery ( 1 ) lines match

( shyly ( 1 ) lines match

( fiery || (shyly ( 2 ) lines match3

( untamed || ( fiery || ( shyly ))) ( 3 ) lines match




Содержание  Назад  Вперед