|
Прототип шаблона ведущего указателя Ниже приведен конечный результат наших усилий. Подставляемые функции переместились на привычное место после объявления класса. Параметр, класс указываемого объекта, должен удовлетворять следующим требованиям: 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; } |
Copyright 2005. Климов Александр. All Right Reserved.