Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpora_oop.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
258.05 Кб
Скачать

45.Шаблоны класса и friend.

Для шаблонов класса, как и для обычных классов, могут быть установлены отношения дружественности. Дружественность может быть установлена между шаблонным классом и глобальной функцией, функцией-членом другого (возможно шаблонного класса) или целым классом (возможно шаблонным).

(ПРИМЕР ИЗ КОНСПЕКТА, НО ВЫДАЁТ ОШИБКУ)

template <class T>

class B;

template <class T>

class A

{

T *m;

int size;

public:

A(int size, T *m);

~A();

friend T fun1 (T&);

friend T B<T>::fun2(A<T> &);

};

template <class T>

class B

{

public:

T fun2(A<T> &);

};

template <class T>

void fun1(T &obj)

{

}

int main()

{

int m1[]={1,2,3};

A <int> a1(3,m1);

fun1(a1);

return 0;

}

46.Реализация smart-указателя.

Если при использовании в программе указателя на объект, память для которого выделена с помощью оператора new, объект становится не нужен, то для его разрушения необходимо явно вызвать оператор delete. В то же время на один объект могут ссылаться множество указателей и, следовательно, нельзя однозначно сказать, нужен ли еще этот объект или он уже может быть уничтожен.

template <typename T>

struct Status { T *RealPtr; int Count;

};

template <typename T>

class Point

{ Status <T> *StatPtr;

Public:

Point (T * ptr = 0);

Point(const Point & );

~Point();

Point & operator =(const Point &);

T * operator->() const;

T & operator*() const;

void get_count() {cout<<StatPtr->Count<<endl;}

};

template<typename T>

Point<T>::Point(T * ptr)

{ if(!ptr)

StatPtr = NULL;

else

{ StatPtr = new Status <T>; StatPtr->RealPtr=ptr; StatPtr->Count = 1;

}

}

template <typename T>

Point<T>::Point(const Point & p): StatPtr(p.StatPtr)

{ if(StatPtr) StatPtr->Count++;

}

template <typename T>

Point<T>::~Point()

{ if(StatPtr)

{ StatPtr->Count--;

if(StatPtr->Count <= 0)

{delete StatPtr->RealPtr; delete StatPtr;

}

}

}

template <typename T>

T * Point <T>::operator->() const

{ if(StatPtr)

return StatPtr->RealPtr;

else return NULL;

}

template <typename T>

T & Point<T>::operator *() const

{ if(StatPtr) return *StatPtr->RealPtr;

else throw "Opps";

}

template <typename T>

Point<T> & Point<T>::operator =(const Point & p)

{ if(StatPtr)

{StatPtr->Count--;

if(StatPtr->Count <= 0)

{delete StatPtr->RealPtr; delete StatPtr;

}

}

StatPtr = p.StatPtr;

if(StatPtr) StatPtr->Count++; return * this;

}

struct Str

{ int a;

char c;

};

int main()

{ Point<Str> pt1(new Str); // генерация класса Point, конструирование

// объекта pt1, инициализируемого указателем

// на структуру Str, далее с объектом можно

// обращаться как с указателем

Point<Str> pt2=pt1,pt3; // для pt2 вызывается конструктор копирования,

// затем создается указатель pt3

pt3=pt1; // pt3 переназначается на объект указателя pt1

(*pt1).a=12; // operator*() получает this указатель на pt1

(*pt1).c='b';

int X=pt1->a; // operator->() получает this-указатель на pt1

char C=pt1->c;

return 0:

}

47.Свойства в С++.

В общем случае, свойство − это пара функций (public), одна из которых отвечает за установку компонент-данных (private) объекта, а другая за их считывание. Такое решение позволяет обеспечить инкапсуляцию данных. Необходимость использования свойств возникает тогда, когда при изменении некоторого параметра требуется произвести ещё некоторые действия.

Наиболее простой способ обеспечения инкапсуляции в C++ заключается в написании пары функций типа get_val() и put_val() для каждого параметра.

Модификатор _declspec получил дополнительный параметр «property». Это позволяет

в классе объявить «виртуальную» переменную и связать её с соответствующими

функциями.

class cls

{ int m;

public:

_declspec(property(get=get_val, put=put_val)) int V;

int get_val()

{ return m; }

void put_val(int v)

{ m = v; }

};

Мэин:

cls obj;

obj.V = 50; // при этом выполняется вызов put_val()

int k = obj.V; // при этом выполняется вызов get_val()

Основной недостаток:

Зависимость от компилятора. Нарушается инкапсуляция

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]