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