Доброго времени суток!
Возник вопрос по применению двух мини-паттернов.
1. Паттерн "самоубийца". Объект создаётся исключительно в куче с помощью фабричного метода, управление временем жизни — через addref/release, причём release при достижении 0 в счётчике ссылок делает delete this.
2. Использование в нестатических невиртуальных методах проверки на this == NULL с возвратом некого значения по умолчанию.
Пример:
template<class TValue>
struct node
{
typedef TValue value_type;
/// create new node
static const node* create(const value_type& value, const node* next = 0)
{
return new node(value, next ? next->addref() : 0);
}
/// increases reference counter
const node* addref() const
{
if (!this)
return 0;
++_refcount;
return this;
}
/// decreases reference counter and frees node if necessary
void release() const
{
if (!this)
return;
--_refcount;
if (!_refcount)
delete this; /// no other node referencers, can be deleted
}
const node* tail() const
{
if (!this)
return 0;
return _next;
}
const value_type& value() const
{
if (!this)
throw std::logic_error("Cannot access structure via null pointer");
return _value;
}
size_t length() const
{
if (!this)
return 0;
return 1 + _tail->length();
}
private:
value_type _value; /// node's value
const node* _next; /// next node in chain
mutable size_t _refcount; /// quantity of node referencers
node(const value_type& value, const node* next)
: _value(value), _next(next)
{ }
~node()
{
_next->release();
}
};
Насколько допустимо применять подобные приёмы? Особенно (this == 0)