Программирование >>  Формирование пользовательского контейнера 

1 ... 20 21 22 [ 23 ] 24 25 26 ... 156


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 *



1 ... 20 21 22 [ 23 ] 24 25 26 ... 156

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика