Материалы книги получены с http://www.itlibitum.ru/
Семантика ведущих указателей
При работе с умными указателями имеется один важный частный случай - когда два умных указателя не должны одновременно ссылаться на один объект. Между указателем и объектом, на который он ссылается, существует однозначное соответствие (за исключением особого случая умных указателей, ссылающихся на NULL). Если в программном дизайне действует такое ограничение, говорят, что реализуется семантика ведущих указателей (master pointers).
Конечно, можно просто объявить через местную газету, что указатели должны использоваться таким и только таким образом. А можно защитить ваших пользователей от самих себя и подкрепить семантические правила языковыми средствами C++. Если вы мудро выберете второй вариант, придется учесть следующее:
1. Указываемые объекты должны создаваться указателями в конструкторах.
2. Деструктор указателя должен удалять указываемый объект.
3. Конструктор копий должен создавать точную копию указываемого объекта.
4. Оператор присваивания operator= должен удалять текущий указываемый объект,
находящийся слева от него, и заменять его копией указываемого объекта справа.
Кроме того, было бы разумно сделать еще две вещи:
5. Ограничить доступ к конструкторам класса указываемого объекта.
6. Создавать указатели с помощью производящих функций (factory functions).
Обе рекомендации будут подробно рассмотрены в последующих разделах. Прототип ведущего указателя, который мы собираемся воплотить, выглядит так:
template <class Type>
class MP {
private:
Type* t;
public:
6
86
MP(); // Создает указываемый объект
MP(const MP<Type>&); // Копирует указываемый объект
~MP(); // Удаляет указываемый объект
MP<Type>& operator=(const MP<Type>&); // Удаляет левосторонний объект,
// копирует правосторонний
Type* operator->() const;
};
Назад Содержание Далее
|