Шаг 3 - Как это применять

Берем код параметризированного класса.

template <class T>
class SmartPointer
{
private:
	T* tObj;
public:
	SmartPointer(T* _t=NULL):tObj(_t);
	~SmartPointer(){if (tObj) delete tObj; };
	operator T*(){return tObj;};
	T* operator->(){return tObj;};
};

1. Обработка обращения к NULL.

Заменяем реализацию оператора -> на:

T* operator->()
{
	if (!tObj)
	{
		cerr<<"NULL";
		tObj = new T;
	}
	return tObj;
};
или
T* operator->()
{
	if (!tObj) throw CError;
	return tObj;
};

Здесь CError класс исключения. Или втыкаем статический экземпляр-шпион.

private:
T* tObj;		// Это было;
static T* spy;	// Это добавлено

Ну и сам перегруженный оператор.

T* operator->()
{
	if (!tObj) return spy;
	return tObj;
};

Здесь нужно пояснить: spy совсем не обязательно класса T. Можно воткнуть производный, и переопределить его функции. Тогда он будет Вам докладывать о попытках обращения к NULL. Не забудьте его создать, инициализировать, и прицепить к указателю. А то вся идея на помойку. Вы пытаетесь отловить обращение к NULL, а там ... NULL!!! "Матрицу" видели?

2. Отладка и трассировка.

Ну это совсем банально. Выносим определение операторов за определение класса и ставим там точку останова. Чтобы не тормозило в релиз версии, окружаем слово inline ифдефами.

template <class T>
#ifndef DEBUG
inline
#endif
SmartPointer<T>::operator T*()
{
	return tObj;
}

template <class T>
#ifndef DEBUG
inline
#endif
T* SmartPointer<T>::operator T->()
{
	return tObj;
}

3. Статистика классов и объектов.

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

4. Кэширование.

Здесь сложнее. Об этом мне самому нужно почитать и полапать руками. Идея, как можно догадаться, в том, что если при обращении к умному указателю объект отсутствует в памяти, он считывается с диска. Проблемы самые очевидные в том, когда его снова отгружать на диск, разрушать объект, и как гарантировать единичность копии объекта при наличии многих ссылок.

Так. Пока тормозим. Интересно, о чем я напишу следующий шаг ?


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Albert Makhmutov - 21.03.2001