Язык программирования C++


"Интеллигентный указатель"


Рассмотрим еще один пример использования класса-шаблона. С его помощью мы попытаемся " усовершенствовать" указатели языка Си++. Если указатель указывает на объект, выделенный с помощью операции new, необходимо явно вызывать операцию delete тогда, когда объект становится не нужен. Однако далеко не всегда просто определить, нужен объект или нет, особенно если на него могут ссылаться несколько разных указателей. Разработаем класс, который ведет себя очень похоже на указатель, но автоматически уничтожает объект, когда уничтожается последняя ссылка на него. Назовем этот класс "интеллигентный указатель" (Smart Pointer). Идея заключается в том, что настоящий указатель мы окружим специальной оболочкой. Вместе со значением указателя мы будем хранить счетчик – сколько других объектов на него ссылается. Как только значение этого счетчика станет равным нулю, объект, на который указатель указывает, пора уничтожать.

Структура Ref хранит исходный указатель и счетчик ссылок.

template <class T> struct Ref { T* realPtr; int counter; };

Теперь определим интерфейс "интеллигентного указателя":

template <class T> class SmartPtr { public: // конструктор из обычного указателя SmartPtr(T* ptr = 0); // копирующий конструктор SmartPtr(const SmartPtr& s); ~SmartPtr(); SmartPtr& operator=(const SmartPtr& s); SmartPtr& operator=(T* ptr); T* operator->() const; T& operator*() const; private: Ref<T>* refPtr; };

У класса SmartPtr определены операции обращения к элементу ->, взятия по адресу "*" и операции присваивания. С объектом класса SmartPtr можно обращаться практически так же, как с обычным указателем.

struct A { int x; int y; }; SmartPtr<A> aPtr(new A); int x1 = aPtr->x; (*aPtr).y = 3;

// создать новый указатель // обратиться к элементу A // обратиться по адресу

Рассмотрим реализацию методов класса SmartPtr. Конструктор инициализирует объект указателем. Если указатель равен нулю, то refPtr устанавливается в ноль. Если же конструктору передается ненулевой указатель, то создается структура Ref, счетчик обращений в которой устанавливается в 1, а указатель – в переданный указатель:




Начало  Назад  Вперед



Книжный магазин