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


         

Определение класса UserQuery - часть 2


           void       evalNot();

           void       evalRParen();

           bool       integrity_check();

          

           int             _paren;

           Query           *_eval;

           vector<string> *_query;

           stack<Query*, vector<Query*> > _query_stack;

           stack<Query*, vector<Query*> > _current_op;

     static short _lparenOn, _rparenOn;

     static map<string,loc*,less<string>,allocator> *_word_map;

};

#endif

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

Ниже показаны реализации различных встроенных операций eval. Операции evalAnd() и evalOr() выполняют следующие шаги. Сначала объект извлекается из стека _query_stack (напомним, что для класса stack, определенного в стандартной библиотеке, это требует двух операций: top() для получения элемента и pop() для удаления его из стека). Затем из хипа выделяется память для объекта класса AndQuery или OrQuery, и указатель на него передается объекту, извлеченному из стека. Каждая операция передает объекту AndQuery или OrQuery счетчики левых или правых скобок, необходимые ему для вывода своего содержимого. И наконец неполный оператор помещается в стек _current_op:

inline void

UserQuery::

evalAnd()

{

           Query *pop = _query_stack.top(); _query_stack.pop();

           AndQuery *pq = new AndQuery( pop );

           if ( _lparenOn )

        { pq->lparen( _lparenOn ); _lparenOn = 0; }

           if ( _rparenOn )

        { pq->rparen( _rparenOn ); _rparenOn = 0; }




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