Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Шаблонный тип - указатель


Автор: Rickert 30.10.2008, 09:59
Допусти у меня есть шаблон класс
Код
template <class TypeItem> class aItem
{
  public:
    aItem<TypeItem>()
    {
      pointer = 0;
    };
    aItem<TypeItem>(TypeItem t)
    {
      data = t;
      pointer = 1;
    };
    ~aItem<TypeItem>()
    {
      if (pointer)
      {
        ...//как отчистить память?
      }
    };
    
    TypeItem data;
    bool pointer;
};

Всё нормально, если TypeItem не является указателем. Если он является указателем, то получается что где-то в программе была выделена память и data является ед. указателем, который знает адрес где надо чистить. Как теперь это сделать?
Учитывая, что TypeItem - это может быть базовый класс, но ссылка содержит указатель на производный от него.

Автор: Alek86 30.10.2008, 10:22
примерно так попробуй
Код

template <class TypeItem, bool b = boost::is_pointer<TypeItem>::value>
class aItem {
  // твоя реализация
};

template <class TypeItem>
class aItem<TypeItem, true> {
  // реализация для указателя
};

Автор: Alexeis 30.10.2008, 10:27
Не знаю, мож в шаблонах можно как-то разделять, классы и указатели на класс, но ИМХО тут ошибка в проектировании. Если нужно чтобы оно само удалялось, оберни указатель в auto_ptr<>, а в свой шаблон подставляй auto_ptr<TypeItem>

Добавлено через 2 минуты и 42 секунды
auto_ptr<> как раз реализует стратегию владения. Сам по себе он статический объект, потому не нуждается в удалении, но как только уничтожается сам, то уничтожает и то чем владеет.

Автор: Lazin 30.10.2008, 10:34
Цитата(Alek86 @ 30.10.2008,  10:22)
примерно так попробуй
Код

template <class TypeItem, bool b = boost::is_pointer<TypeItem>::value>
class aItem {
  // твоя реализация
};

template <class TypeItem>
class aItem<TypeItem, true> {
  // реализация для указателя
};

можно проще и без буста
Код

template <class T> 
class aItem
{
public:
    aItem() : data()
    {
    }
    aItem(const T& t) : data(t)
    {
    }

    T data;
};

template <class T>
class aItem<T*>
{
public:
    aItem() : pointer(0)
    {
    }
    aItem(T* t) : pointer(t)
    {
    }
    ~aItem()
    {
        if(pointer) delete pointer;
    }

    T* pointer;
};

Автор: Alek86 30.10.2008, 10:38
гы
точно, перемудрил smile

Автор: Rickert 30.10.2008, 11:47
Получается две реализации класса деражть надо: для объектов и для указателей? Ясно, благодарю!

Автор: J0ker 30.10.2008, 17:49
Цитата(Alexeis @  30.10.2008,  10:27 Найти цитируемый пост)
Не знаю, мож в шаблонах можно как-то разделять, классы и указатели на класс

шаблон можно специализировать указателем:
Код

template <class T>
class A
{
private:
    T t;
public:
    A(): t(T()) {}
};

template <class T>
class A<T *>
{
private:
    T *t;
public:
    A():t(new T())  {}
    ~A() {
        delete t;
    }
};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)