|
Программирование >> Формирование пользовательского контейнера
II Смена объекта, на который указывает оЬ. оЬ = new MyClassCll, 21); cout *ob endl; Вызов функции-члена класса с помощью объекта GCPtr. cout Sum is : ob->sum() endl; Присваивание значения члену класса с помощью объекта GCPtr. ob->val = 98.6; cout ob->val: ob->val endl; cout , ob is now *ob endl; } catch(bad alloc exc) { cout Allocatino error!\n ; return 1; return 0; Обратите внимание на то, что доступ к данным-членам класса Myciass осуществляется с помощью операции ->. Напоминаю, что тип GCPtr описывается как указатель. Следовательно, операции с участием объекта GCPtr выполняются точно так же, как с любым другим указателем. Далее приведен вывод программы с выключенным режимом отображения. (10 20) (11 21) Sum is : 32 ob->val: 98.6 6b is now (11 21) Destructing Ilass(ll, 21) Destructing MyClass(10, 20) Обратите особое внимание на две последние строки. Это вывод деструктора -MyClass во время сбора мусора. Несмотря на то, что создан всего один указатель типа GCPtr, в динамической памяти размещены два объекта типа MyClass. Оба они представлены как элементы в списке сбора мусора. Когда указатель оЬ уничтожается, проверяется список gclist в поисках элементов с нулевыми счетчиками ссылок. В данном случае найдены два таких элемента, и память, на которую они указывают, освобождается. 2.8. Демонстрация функциональных возможностей класса ocPtr #include <ioscreain> #include <new> #include gc.h using namespace std; Простой класс для тестирования работы указателя типа GCPtr с классами, class MyClass { int а, b; public: doiible val; MyClass0 a = b = 0; } MyClass(int X, int y) { a = x; b = y; val =0.0; -MyClass 0 { cout Destructing MyClass( a , b )\n ; int sumO { return a + b; friend ostream &operator (ostream &strm, MyClass &obj); }; Создает вставку (inserter) в поток вывода для класса MyClass. Большая демонстрационная программа программа листинга 2.8 представляет собой более пространный пример, тестирующий все свойства указателя типа GCPtr. OS cream &operator (ostream &strm, MyClass &obj) strm ( obj.a obj .b ) ; return strm; Передается нормальный указатель функции, void passPtr(int *p) { cout Inside passPtrO: *p endl; Передается указатель типа GCPtr функции, void passGCPtr(GCPtr<int, 0> p) { cout Inside passGCPtrO: *p endl; int mainO { try { Объявляется объект GCPtr, указывающий на тип int. GCPtr<int> ip; Размещается объект int и его адрес присваивается ip. ip = new int(22); Вьшодится значение объекта int. cout Value at *ip: *ip \n\n ;. Объект ip передается функции. passGCPtr(ip); Создается объект ip2 и затем выходит за пределы области видимости GCPtr<int> ip2 = ip; 1 int *p = ip; преобразование в указатель типа int *
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |