Читая Джеффа Элджера увидел интересный прием:
class UnsafeNode {
public:
  UnsafeNode(UnsafeNode * next_, void * data_);
  virtual ~UnsafeNode();
  UnsafeNode * Next();
  void * Data();
private:
  UnsafeNode * m_Next;
  void       * m_Data;
};
template < typename T>
class SafeNode : private UnsafeNode {
public:
  SafeNode(SafeNode * next_, T * data_) : UnsafeNode(next_, data_) {}
  virtual ~SafeNode() { delete( (T*)Data() ); }
  SafeNode * Next()   { return( (SafeNode*)UnsafeNode::Next() ); }
  T *  Data()         { return( (T *)UnsafeNode::Data()); } 
};
1) Потомки не видят безобразия в базовом классе, т.к. применяется закрытое наследование
2) Можно применить любой тип, т.к. шаблон
3) Коректно удалится в деструкторе, т.к. задана привязка к типу

Комментариев нет:
Отправить комментарий