cpp-oop (823968), страница 22
Текст из файла (страница 22)
Работа с объектом с использованием разделяемых объектов-указателей.#include <iostream>#include <stdlib.h>#include <conio.h>#include <boost/shared_ptr.hpp>using namespace std;using namespace boost;class A{private:int num;public:A(int Num):num(Num){cout<< "Object created..."<<endl;}~A(){cout<< "Object deleted..."<<endl;}void Print(){cout<<"num="<<num<<endl;}};void main(){shared_ptr<A> ptr_obj(new A(5)); // создание объекта и указателяОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»170{ // новый блокshared_ptr<A> ptr1 = ptr_obj; // разделяемый указатель// на объектptr1->Print();shared_ptr<A> ptr2 = ptr_obj;// второй разделяемый// указатель на тот же объектptr2->Print();ptr_obj.reset(); // освобождаем исходный указатель} // здесь переменные ptr1 и ptr2 уничтожаются и объект корректно удаляетсяgetch();}ОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»1718.4 Шаблон weak_ptrШаблон weak_ptr также пока не определен в стандарте, но реализован вбиблиотеке boost в адресном пространстве boost. Его применяют, если необходимобъект-указатель, не владеющий динамическим объектом.
Необходимость такогоуказателя, например, может быть вызвана необходимостью создания двух объекта,ссылающиеся друг на друга. При реализации такой взаимосвязи с использованиемразделяемых указателей, удалить объекты не удастся.Шаблон weak_ptr позволяет объявлять объекты-указатели, которые так же как иshared_ptr связаны со счетчиком ссылок, однако не увеличивают его значения. Еслиодну из связей между взаимоссылающимися объектами реализовать через weak_ptr, тообъекты будут корректно удалены.Поскольку объекты-указатели шаблона weak_ptr не увеличивают счетчика ссылок,возможно удаление объекта при существующем «слабом» указателе на него, как прииспользовании обычных указателей.
Чтобы не допустить ошибки в этом случае, объектуказателя weak_ptr не действует как обычный указатель, т. е. не предоставляетвозможности оперирования над объектом. Вместо этого шаблон предусматривает методlock(), который возвращает новый объект-указатель shared_ptr на динамическийобъект, и, соответственно, на время жизни этого объекта shared_ptr увеличиваетсчетчик ссылок объекта.Проверить существование объекта можно и создавая объект-указатель shared_ptrна него.
Для этого используют метод класса weak_ptrexpired(), которыйвозвращает true, если объект, для которого создавался указатель перестал существовать,и false – в противном случае.Пример 8.4. Демострация различия shared_ptr и weak_ptr.#include <iostream>#include <stdlib.h>#include <conio.h>#include <boost/weak_ptr.hpp>#include <boost/shared_ptr.hpp>using namespace std;ОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»172using namespace boost;int main(){shared_ptr<int> s1( new int(5) );// создаем объект ->// счетчик ссылок = 1shared_ptr<int> s2 = s1; // создаем сильный указатель ->// счетчик ссылок = 2weak_ptr<int> w = s2;// создаем слабый указатель ->// счетчик ссылок не меняетсяs2.reset();// освобождаем s2 ->// счетчик ссылок = 1 и объект существуетs2 = w.lock(); // связываем сильный указатель с объектом ->// счетчик ссылок = 2s2.reset();s1.reset();// освобождаем s2 -> счетчик ссылок = 1// освобождаем s1 ->// счетчик ссылок = 0 -> объект уничтожен// проверка существования объекта (способ 1)if (w.expired())cout<<"Object is not exists..."<<endl;else cout<<"Object exists..."<<endl;// проверка существования объекта (способ 2)s2 = w.lock();// пытаемся создать сильный указатель из слабого ->// s2 равен 0, т.к.
объект не существуетif (s2.get() == 0) // получаем адрес объекта и сравниваем с нулемcout<<"Object is not exists..."<<endl;else cout<<"Object exists..."<<endl;getch();}Таким образом шаблон weak_ptr гарантирует, что, если динамический объект ужеуничтожен, то это можно безопасно проверить.ОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»173Вопросы для самоконтроля1. Какие проблемы существуют при работе с указателями в С++?Ответ.2. Какие возможности предоставляет шаблон auto_ptr? Какие проблемы при егоиспользовании остаются нерешенными?Ответ.3. Какие возможности предоставляет шаблон shared_ptr?Ответ.4. Как взаимодействют между собой объекты шаблонов shared_ptr и wear_ptr?Ответ.ОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»174ЛИТЕРАТУРА1. Березин Б.И., Березин C.Б. Начальный курс С и С++. – М.: «Диалог-МИФИ», 1997.2. Вайнер Р., Пинсон Л. С++ изнутри: Пер. с англ. – Киев: «ДиаСофт», 1993.3. Лукас П. С++ под рукой: Пер. с англ. – Киев: «ДиаСофт», 1993.4.
Подбельский В.В. Язык Си++. – М.: Финансы и статистика, 1995.5. Скляров В.А. Язык С++ и объектно-ориентированное программирование. – М.:Высшая школа., 1997.6. Страуструп Б. Язык программирования С++: Пер. с англ. – СПб.; М.: «Невскийпроспект» – «Издательство БИНОМ», 1999.7. Иванова Г.С., Ничушкина Т.Н., Пугачев Е.К. Объектно-ориентированноепрограммирование: Учебник для ВУЗов. – М.: Изд-во МГТУ им.
Н.Э. Баумана, 2007.8. Шилдт Г. Полный справочник по С++, 4-е издание: Пер. с англ. – М.: «Вильямс»,2009.ОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008».