Russian Qt Forum

Qt => Общие вопросы => Тема начата: naf2000 от Январь 28, 2011, 13:02



Название: Обертка над QList
Отправлено: 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


Название: Re: Обертка над QList
Отправлено: Пантер от Январь 28, 2011, 13:06
При копировании IMDList что происходит? А? Думай.


Название: Re: Обертка над QList
Отправлено: naf2000 от Январь 28, 2011, 13:16
При копировании IMDList что происходит? А? Думай.
не въехал, ошибочно то работает как раз с
Код
C++ (Qt)
MDList<A> *list = new MDList<A>();


Название: Re: Обертка над QList
Отправлено: Пантер от Январь 28, 2011, 14:19
foreach делает копию контейнера.


Название: Re: Обертка над QList
Отправлено: naf2000 от Январь 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) {}