Язык программирования C++. Вводный курс




Определение базового класса - часть 5


Для вывода найденных строк нам необходимо как разрешающее множество, так и фактический текст, из которого взяты строки. Причем вектор позиций у каждой операции должен быть свой, а экземпляр текста нужен только один. Поэтому мы определим его статическим членом класса Query. (Реализация функции display()

опирается только на эти два члена.)

Вот результат первой попытки создать абстрактный базовый класс Query (конструкторы, деструктор и копирующий оператор присваивания еще не объявлены: этим мы займемся в разделах 17.4 и 17.6):

#include <vector>

#include <set>

#include <string>

#include <utility>

typedef pair< short, short > location;

class Query {

public:

     // конструкторы и деструктор обсуждаются в разделе 17.4

     // копирующий конструктор и копирующий оператор присваивания

     // обсуждаются в разделе 17.6

     // операции для поддержки открытого интерфейса

           virtual void eval() = 0;

           virtual void display () const;

          

     // функции доступа для чтения

           const set<short> *solution() const;

           const vector<location> *locations() const { return &_loc; }

     static const vector<string> *text_file() {return _text_file;}

protected:

           set<short>* _vec2set( const vector<location>* );

     static vector<string> *_text_file;

           set<short>         *_solution;

           vector<location>   _loc;

};

inline const set<short>

Query::

solution()

{

   return _solution

        ? _solution

        : _solution = _vec2set( &_loc );

}

Странный синтаксис

           virtual void eval() = 0;

говорит о том, что для виртуальной функции eval() в абстрактном базовом классе Query нет определения: это чисто виртуальная функция, “удерживающая место” в открытом интерфейсе иерархии классов и не предназначенная для непосредственного вызова из программы. Вместо нее каждый производный класс должен предоставить настоящую реализацию. (Подробно виртуальные функции будут рассматриваться в разделе 17.5.)




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