Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонный тип - указатель, отчистить память 
V
    Опции темы
Rickert
Дата 30.10.2008, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Допусти у меня есть шаблон класс
Код
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 - это может быть базовый класс, но ссылка содержит указатель на производный от него.

Это сообщение отредактировал(а) Rickert - 30.10.2008, 10:01


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Alek86
Дата 30.10.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



примерно так попробуй
Код

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

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



--------------------
user posted image    user posted image
PM MAIL   Вверх
Alexeis
Дата 30.10.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Lazin
Дата 30.10.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(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;
};


Это сообщение отредактировал(а) Lazin - 30.10.2008, 10:35
PM MAIL Skype GTalk   Вверх
Alek86
Дата 30.10.2008, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



гы
точно, перемудрил smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
Rickert
Дата 30.10.2008, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



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


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
J0ker
Дата 30.10.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



Цитата(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;
    }
};



--------------------
user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0545 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.