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



         

Конкретизация шаблона класса - часть 3


// Queue<int> не конкретизируется при таком использовании в foo()

void foo( Queue<int> &qi )

{

   Queue<int> *pqi = &qi;

   // ...

}

Определение класса необходимо знать, когда определяется объект этого типа. В следующем примере определение obj1 ошибочно: чтобы выделить для него память, компилятору необходимо знать размер класса Matrix:

class Matrix;

Matrix obj1;   // ошибка: класс Matrix не определен

class Matrix { ... };

Matrix obj2;  // правильно

Таким образом, конкретизация происходит тогда, когда определяется объект класса, конкретизированного по этому шаблону. В следующем примере определение объекта qi приводит к конкретизации шаблона Queue<int>:

Queue<int> qi;   // конкретизируется Queue<int>

Определение Queue<int> становится известно компилятору именно в этой точке, которая называется точкой конкретизации данного класса.

Если имеется указатель или ссылка на конкретизированный шаблон, то конкретизация также производится в момент обращения к объекту, на который они ссылаются. В определенной выше функции foo() класс Queue<int> конкретизируется в следующих случаях: когда разыменовывается указатель pqi, когда ссылка qi используется для получения значения именуемого объекта и когда pqi или qi употребляются для доступа к членам или функциям-членам этого класса:

void foo( Queue<int> &qi )

{

   Queue<int> *pqi = &qi;

   // Queue<int> конкретизируется в результате вызова функции-члена

   pqi->add( 255 );

   // ...

}

Определение Queue<int> становится известным компилятору еще до вызова функции-члена add() из foo().

Напомним, что в определении шаблона класса Queue есть также ссылка на шаблон QueueItem:

template <class Type>

class Queue {

public:

   // ...

private:

   QueueItem<Type> *front;

   QueueItem<Type> *back;

};

При конкретизации Queue типом int члены front и back становятся указателями на QueueItem<int>. Следовательно, конкретизированный экземпляр Queue<int> ссылается на экземпляр QueueItem, конкретизированный типом int. Но поскольку соответствующие члены являются указателями, то QueueItem<int> конкретизируется лишь в момент их разыменования в функциях-членах класса Queue<int>.




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