Название: Обертка над 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) {}
|