17.4.2. Конструктор производного класса

17.4.2. Конструктор производного класса

В классе NameQuery также определены два конструктора. Они объявлены открытыми, поскольку ожидается, что в приложении будут создаваться объекты этого класса:

class NameQuery : public Query {

public:

explicit NameQuery( const string& );

NameQuery( const string&, const vector* );

// ...

protected:

// ...

};

Конструктор с одним параметром принимает в качестве аргумента строку. Она передается конструктору объекта типа string, который вызывается для инициализации члена _name. Конструктор по умолчанию базового класса Query вызывается неявно:

inline

NameQuery::

NameQuery( const string &name )

// Query::Query() вызывается неявно

: _name( name )

{}

Конструктор с двумя параметрами также принимает строку в качестве одного из них. Второй его параметр - это указатель на вектор позиций. Он передается закрытому конструктору базового класса Query. (Обратите внимание, что _present нам больше не нужен, и мы исключили его из числа членов NameQuery.)

inline

NameQuery::

NameQuery( const string &name, vector& location& *ploc )

: _name( name ), Query( *ploc )

{}

Конструкторы можно использовать так:

string title( "Alice " );

NameQuery *pname;

// проверим, встречается ли "Alice " в отображении слов

// если да, получить ассоциированный с ним вектор позиций

if ( vector location *ploc = retrieve_location( title ))

pname = new NameQuery( title, ploc );

else pname = new NameQuery( title );

В каждом из классов NotQuery, OrQuery и AndQuery определено по одному конструктору, каждый из которых вызывает конструктор базового класса неявно:

inline NotQuery::

NotQuery( Query *op = 0 ) : _op( op ) {}

inline OrQuery::

OrQuery( Query *lop = 0, Query *rop = 0 )

: _lop( lop ), _rop( rop )

{}

inline AndQuery::

AndQuery( Query *lop = 0, Query *rop = 0 )

: _lop( lop ), _rop( rop )

{}

(В разделе 17.7 мы построим объекты каждого из производных классов для представления различных запросов пользователя.)