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



     Минералы группы силлиманита. |     

Определение шаблона класса


Предположим, что нам нужно определить класс, поддерживающий механизм очереди. Очередь– это структура данных для хранения коллекции объектов; они помещаются в конец очереди, а извлекаются из ее начала. Поведение очереди описывают аббревиатурой FIFO – “первым пришел, первым ушел”. (Определенный в стандартной библиотеке C++ тип, реализующий очередь, упоминался в разделе 6.17. В этой главе мы создадим упрощенный тип для знакомства с шаблонами классов.)

Необходимо, чтобы наш класс Queue поддерживал следующие операции:

  • добавить элемент в конец очереди:
  • void add( item );

    • удалить элемент из начала очереди:
    • item remove();

      • определить, пуста ли очередь:
      • bool is_empty();

        • определить, заполнена ли очередь:
        • bool is_full();

          Определение Queue могло бы выглядеть так:

          class Queue {

          public:

             Queue();

             ~Queue();

             Type& remove();

             void add( const Type & );

             bool is_empty();

             bool is_full();

          private:

             // ...

          };

          Вопрос в том, какой тип использовать вместо Type? Предположим, что мы решили реализовать класс Queue, заменив Type на int. Тогда Queue может управлять коллекциями объектов типа int. Если бы понадобилось поместить в очередь объект другого типа, то его пришлось бы преобразовать в тип int, если же это невозможно, компилятор выдаст сообщение об ошибке:

          Queue qObj;

          string str( "vivisection" );

          qObj.add( 3.14159 );  // правильно: в очередь помещен объект 3

          qObj.add( str );      // ошибка: нет преобразования из string в int

          Поскольку любой объект в коллекции имеет тип int, то язык C++ гарантирует, что в очередь можно поместить либо значение типа int, либо значение, преобразуемое в такой тип. Это подходит, если предстоит работа с очередями объектов только типа int. Если же класс Queue должен поддерживать также коллекции объектов типа double, char, комплексные числа или строки, подобная реализация оказывается слишком ограничительной.

          Конечно, эту проблему можно решить, создав копию класса Queue для работы с типом double, затем для работы с комплексными числами, затем со строками и т.д. А поскольку имена классов перегружать нельзя, каждой реализации придется дать уникальное имя: IntQueue, DoubleQueue, ComplexQueue, StringQueue. При необходимости работать с другим классом придется снова копировать, модифицировать и переименовывать.




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