Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Элджер Д. - C++. Библиотека программиста - 1999.pdf
Скачиваний:
141
Добавлен:
13.08.2013
Размер:
1.98 Mб
Скачать

89

}

return *this;

}

};

Разумеется, если вы вообще не хотите поддерживать присваивание, достаточно объявить оператор = закрытым.

Прототип шаблона ведущего указателя

Ниже приведен конечный результат наших усилий. Подставляемые функции переместились на привычное место после объявления класса. Параметр, класс указываемого объекта, должен удовлетворять следующим требованиям:

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;

Соседние файлы в предмете Программирование на C++