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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обертка над QList  (Прочитано 2660 раз)
naf2000
Гость
« : Январь 28, 2011, 13:02 »

сделал класс-обёртку над QList
Код
C++ (Qt)
template <class T>
class IMDList
{
public:
   typedef typename QList<T*>::ConstIterator const_iterator;
   const_iterator begin() const;
   const_iterator end() const;
   int count() const;
protected:
   QList<T*> *list;
};
 
template <class T>
class MDList:public IMDList<T>
{
public:
   MDList();
   virtual ~MDList();
};
 
template <class T>
typename IMDList<T>::const_iterator IMDList<T>::begin() const
{
   return this->list->begin();
}
 
template <class T>
typename IMDList<T>::const_iterator IMDList<T>::end() const
{
   return this->list->end();
}
 
template <class T>
int IMDList<T>::count() const
{
   return this->list->count();
}
 
template <class T>
MDList<T>::MDList()
{
   this->list = new QList<T*>();
   //добавим три элемента для тестирования:
   this->list->append(new T());
   this->list->append(new T());
   this->list->append(new T());
}
 
template <class T>
MDList<T>::~MDList()
{
   delete this->list;
}
 

и запустил маленький тест:
Код
C++ (Qt)
class A
{
};
 
void foo()
{
   int result=0;
   MDList<A> *list = new MDList<A>();
   result = list->count(); //3, все ок
   result = 0;
   foreach(A *a, *list)
   {
       result++; //растет до 3, все ок
   }
   result=list->count(); //0, почему???
   IMDList<A> *list2 = new MDList<A>();
   result=list2->count(); //3, все ок
   result=0;
   foreach(A *a, *list2)
   {
       result++; //растет до 3, все ок
   }
   result=list2->count(); //3, все ок
}
 
вот непонятно место, где показывает, что количество в коллекции 0
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Январь 28, 2011, 13:06 »

При копировании IMDList что происходит? А? Думай.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
naf2000
Гость
« Ответ #2 : Январь 28, 2011, 13:16 »

При копировании IMDList что происходит? А? Думай.
не въехал, ошибочно то работает как раз с
Код
C++ (Qt)
MDList<A> *list = new MDList<A>();
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Январь 28, 2011, 14:19 »

foreach делает копию контейнера.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
naf2000
Гость
« Ответ #4 : Январь 28, 2011, 15:08 »

foreach делает копию контейнера.
ага, а у меня нет конструктора копирования, он использует по-умолчанию с поверхностным копированием, потом уничтожает копию и разрушается разделяемую с исходным объектом начинку, написал явно, работает:
Код
C++ (Qt)
IMDList(const IMDList<T>& c) {this->list = new QList<T*>(*c.list);}
MDList(const IMDList<T>& c):IMDList<T>(c) {}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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