Прототип шаблона ведущего указателя
Ниже приведен конечный результат наших усилий. Подставляемые функции переместились на привычное место после объявления класса. Параметр, класс указываемого объекта, должен удовлетворять следующим требованиям:
1. Он должен иметь безаргументный конструктор.
2. Он должен либо перегружать конструктор копий, либо предоставленный компилятором
конструктор копий по умолчанию должен подходить для использования в шаблоне ведущего указателя.
Если хотя бы одно из этих требований не выполняется, придется внести изменения в класс
указываемого объекта или ведущего указателя, или в оба класса сразу. Помните: в реализации конструктора копий и оператора присваивания ведущего указателя будет использоваться конструктор копий указываемого объекта (то есть параметра шаблона).
template <class Type>
class MP {
private:
Type* t;
public:
MP(); // Создает указываемый объект
MP(const MP<Type>&); // Копирует указываемый объект
~MP(); // Удаляет указываемый объект
MP<Type>& operator=(const MP<Type>&);
Type* operator->() const;
};
template <class Type>
inline MP<Type>::MP() : t(new Type)
{}
template <class Type>
inline MP<Type>::MP(const MP<Type>& mp) : t(new Type(*(mp.t)))
{}
template <class Type>
inline MP<Type>::~MP()
{
delete t;
}
template <class Type>
inline MP<Type>& MP<Type>::operator=(const MP<Type>& mp)
{
if (this != &mp) {
delete t;
t = new Type(*(mp.t));
}
return *this;
}
template <class Type>
inline Type* MP<Type>::operator->() const
{
return t;
}