Russian Qt Forum
Ноябрь 23, 2024, 21:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: free_and_nil. Delphi посвящается  (Прочитано 6652 раз)
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« : Сентябрь 08, 2010, 19:38 »

Довольно частая задача при работе с обычными указателями - зачистка после освобождения. Этот подход лучше взять за правило, уменьшает количество часов проведенных в отладке..

Код
C++ (Qt)
/*! Delete obj and assign NULL */
template <class T>
void free_and_nil(T*& obj)
{
   delete obj;
   obj = NULL;
}
 
Записан

Гугль в помощь
Sancho_s_rancho
Гость
« Ответ #1 : Сентябрь 08, 2010, 19:51 »

QPointer, черт побери, вы все-таки его изобрели!
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #2 : Сентябрь 08, 2010, 23:34 »

QPointer, черт побери, вы все-таки его изобрели!
да нет же Улыбающийся не все классы в плюсцах унаследованы от QObject...
Записан

Гугль в помощь
Akon
Гость
« Ответ #3 : Сентябрь 09, 2010, 16:31 »

Довольно частая задача при работе с обычными указателями - зачистка после освобождения. Этот подход лучше взять за правило, уменьшает количество часов проведенных в отладке..

Код
C++ (Qt)
/*! Delete obj and assign NULL */
template <class T>
void free_and_nil(T*& obj)
{
   delete obj;
   obj = NULL;
}
 

Делал то же самое в С++Builder! Тока у меня был в точности аналогичный макро FREE_AND_NULL! Шаблоны я тогда как-то не юзал. В делфи, насколько помню, задача решается естественным образом: obj := nil;
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #4 : Сентябрь 09, 2010, 16:45 »

внесу свои 5 копеек о бесполезности данной функции и полезности QPointer
Речь идет лишь о написании приложений с использованием Qt.
Логически так сложилось, что в qt есть разделение на "сущности" и "данные". Сущности - это класс, представляющий некий объект реального мира. Такие объекты можно нельзя отличить друг от друга по их свойствам - к примеру есть 2 виджета одинакового размера, в одних координатах. Все их свойства одинаковы, но это разные объекты. И есть данные, по сути набор значений. При работе с 2мя такими классами нас не интересует один ли объект это, или два - нам важно значение. В Qt принято соглашение объекты 1го типа наследовать от QObject и передавать по указателю, а объекты 2го - либо делать страктом, либо использовать шаред поинтер и передавать по значению.
Записан
BigZ
Гость
« Ответ #5 : Сентябрь 09, 2010, 17:10 »

Довольно частая задача при работе с обычными указателями - зачистка после освобождения. Этот подход лучше взять за правило, уменьшает количество часов проведенных в отладке..

Код
C++ (Qt)
/*! Delete obj and assign NULL */
template <class T>
void free_and_nil(T*& obj)
{
   delete obj;
   obj = NULL;
}
 
Полностью согласен
#define free_and_nil(x) delete x; x = 0;





Записан
Akon
Гость
« Ответ #6 : Сентябрь 09, 2010, 20:16 »

внесу свои 5 копеек о бесполезности данной функции и полезности QPointer
Речь идет лишь о написании приложений с использованием Qt.
Логически так сложилось, что в qt есть разделение на "сущности" и "данные". Сущности - это класс, представляющий некий объект реального мира. Такие объекты можно нельзя отличить друг от друга по их свойствам - к примеру есть 2 виджета одинакового размера, в одних координатах. Все их свойства одинаковы, но это разные объекты. И есть данные, по сути набор значений. При работе с 2мя такими классами нас не интересует один ли объект это, или два - нам важно значение. В Qt принято соглашение объекты 1го типа наследовать от QObject и передавать по указателю, а объекты 2го - либо делать страктом, либо использовать шаред поинтер и передавать по значению.

Не совсем понял, как все это относится к теме  Непонимающий

Спору нет, для QObject типов QPointer самое оно (с Qt 4.5, если не ошибаюсь, рекомендуется использовать QWeakPointer). В общем случае (для произвольных типов) можно использовать связку QSharedPointer/QWeakPointer или, если без Qt, boost::shared_ptr/boost::weak_ptr. Описанное автором решение, ИМХО, имеет право на жизнь как исключительно легковесный и простой вариант.
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #7 : Сентябрь 10, 2010, 09:01 »

Полностью согласен
#define free_and_nil(x) delete x; x = 0;
Ну разве что, считается, что дефайны не очень хорошо.. а так да, вариант
Записан

Гугль в помощь
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.183 секунд. Запросов: 22.