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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как ограничить кол-во элементов в QList или ему подобных  (Прочитано 6396 раз)
Павел_F.
Гость
« : Октябрь 28, 2009, 12:03 »

Нужем список с ограничением на минимальное и максимальное кол-во элементов. Причем нужен именно шаблон списка потому что нужно списки десятка разных типов. Cмотрю в сторону QList и не вижу нужного ( именно ограничений в размерах). Как прикрутить? Может есть у кого идеи?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #1 : Октябрь 28, 2009, 12:10 »

не пойму зачем? Что будет если список полон, а ты вызываешь append() или insert()?
Записан

Юра.
Павел_F.
Гость
« Ответ #2 : Октябрь 28, 2009, 13:08 »

Если список полон а я добавляю элементы нужно будет вернуть false и ничего не делать. Ровно как и когда вызываеш например removeAt() или removeLast() а список уже достиг минимума. Сам уже думал на тему целесообразности использовать список. Но если использовать массив то придется что-то динамическое мудрить ( максимум и минимум могут меняться в процессе работы) и придется что-то изобретать для передачи этого в нормальный список ( у библиотечной функции, которую я не обойду, на  входе QList), в результате от списка не уйдеш, он "дан свыше", а допонительная сложность возникнет.
« Последнее редактирование: Октябрь 28, 2009, 13:19 от Павел_F. » Записан
BRE
Гость
« Ответ #3 : Октябрь 28, 2009, 13:20 »

Можно примерно так:
Код
C++ (Qt)
template <class T, int minCount, int maxCount>
class LimitList
{
public:
bool add( const T &item )
{
if( m_list.size() >= maxCount )
return false;
 
m_list.append( item );
return true;
}
 
bool remove(...)
{
}
 
private:
QList<T> m_list;
};
 

Только при конструировании этого объекта нужно в него minCount элементов каких-то добавлять.
Записан
BRE
Гость
« Ответ #4 : Октябрь 28, 2009, 13:22 »

( максимум и минимум могут меняться в процессе работы)
Сейчас заданы жОстко, но можно и переменные использовать.
Записан
Павел_F.
Гость
« Ответ #5 : Октябрь 28, 2009, 13:44 »

Немного переделал.
file.h:
Код:
  
template <class T>
  class LimitList
  {
    public:
      LimitList();
      bool add( const T &item );      
    private:
      int maxCount;
      QList<T> m_list;
  };
file.cpp:
Код:
template<class T>
LimitList< T>::LimitList()
{
  maxCount = 10;
}

template <class T>
bool LimitList< T>::add( const T &item )
{
  if( m_list.size() >= maxCount )
    return false;
  
  m_list.append( item );
  return true;
}
файл проекта делал qmake -project и qmake - file.pro для makefile.
Объектник собирается нормально но приложение не линкуется.
Цитировать
test.o: In function `test::test(QWidget*)':
test.cpp:(.text+0xabd): undefined reference to `LimitList<int>::LimitList()'
test.o: In function `test::test(QWidget*)':
test.cpp:(.text+0x164d): undefined reference to `LimitList<int>::LimitList()'
collect2: выполнение ld завершилось с кодом возврата 1
Что ему не так?
« Последнее редактирование: Октябрь 28, 2009, 13:47 от Павел_F. » Записан
BRE
Гость
« Ответ #6 : Октябрь 28, 2009, 13:45 »

Это шаблон, сделай все в файле .h
Записан
Павел_F.
Гость
« Ответ #7 : Октябрь 28, 2009, 13:51 »

Спасибо, заработало. А с шаблонами вообще в *.cpp  не перетащиш? А то много функций в *.h файле "не красиво"...
Записан
BRE
Гость
« Ответ #8 : Октябрь 28, 2009, 14:14 »

Спасибо, заработало. А с шаблонами вообще в *.cpp  не перетащиш? А то много функций в *.h файле "не красиво"...
http://www.forum.crossplatform.ru/index.php?showtopic=3591&st=0&start=0
Записан
Павел_F.
Гость
« Ответ #9 : Октябрь 28, 2009, 14:23 »

О, спасибо еще раз. Теперь все ясно.
Кстати, вы в той теме по ссылке писали что не встречали реализацию через inline. Покурил исходники QList и там оба подхода реализованы...
Записан
BRE
Гость
« Ответ #10 : Октябрь 28, 2009, 14:27 »

О, спасибо еще раз. Теперь все ясно.
Кстати, вы в той теме по ссылке писали что не встречали реализацию через inline. Покурил исходники QList и там оба подхода реализованы...
Второй вариант имеется ввиду с реализацией в файле .cpp
Записан
Павел_F.
Гость
« Ответ #11 : Октябрь 28, 2009, 14:41 »

Видимо не до конца понятно... Ладно, задача решена. Пойду покурю книжку про шаблоны и как их едят.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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