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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Наследование от QList.  (Прочитано 13964 раз)
SASA
Гость
« : Март 09, 2011, 19:37 »

Решил сделать контейнер аля QStringList.

Код:
class CMyClassList : public QList<CMyClass>
{
...
}

Проблема 1. Реализация должна быть в h-файле. Причем, если используется внутри библиотеки  - можно и в cpp, а если экспортируется, то нельзя. Кто-нибудь знает почему?

Проблема 2. У QList нет метода, возвращающего T&. Поэтому в методах CMyClassList приходится писать (*this)[_i]. Или сделать функцию
Код:
inline CMyClass & CMyClassList::resultAt(int _i)
{
return (*this)[_i];
}
То ли троли забыли, то ли наследоваться от QList это плохо.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Март 09, 2011, 20:36 »

А зачем наследоваться от QList?
Записан

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

typedef QList<CMyClass> CMyClassList;
Может это все что нужно?
Записан
SASA
Гость
« Ответ #3 : Март 10, 2011, 00:22 »

typedef QList<CMyClass> CMyClassList;
Может это все что нужно?
Сначала было так. Но потом начали появляться операции над всеми элементами контейнера. Например, вызвать определённый метод. Думал сделать QList членом класса, но CMyClassList - контейнер, и используется как контейнер. Наследование самое оно.
А зачем наследоваться от QList?
Например, QstrinList.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #4 : Март 10, 2011, 08:16 »

Неверным путем идешь, товарищ. Улыбающийся
Определенный метод для всем лучше сделать через стандартные алгоритмы и свой функтор.
Записан

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

Неверным путем идешь, товарищ. Улыбающийся
Определенный метод для всем лучше сделать через стандартные алгоритмы и свой функтор.

Не понял.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #6 : Март 10, 2011, 10:06 »

Образный пример:
Код
C++ (Qt)
CMyClass {
.........
public:
  void someFunction ();
.........
}
...................
struct CMyClassFunctor {
void operator() (CMyClass *c) {c->someFunction ();}
}
.............
QList <CMyClass*> list;
std::for_each (list.begin(), list.end(), CMyClassFunctor ());
Записан

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

Пантер, что же плохого в насдовании?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #8 : Март 10, 2011, 11:59 »

Отвечу вопросом на вопрос: а зачем оно в данном случае? Бритва Оккама
Записан

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

Образный пример:
Код
C++ (Qt)
std::for_each (list.begin(), list.end(), CMyClassFunctor ());

Суть в том, что бы избавиться от таких конструкций по всему коду. Отличий от цикла, проходящего по всем элементам, не много.

И 10 функторов смотрятся "хуже", чем 10 методов одного класса. А если два таких списка?
« Последнее редактирование: Март 10, 2011, 12:22 от SASA » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #10 : Март 10, 2011, 12:24 »

Тогда лучше QList агрегировать в свой класс. Не нужно наследоваться от классов, которые не созданы для наследования.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #11 : Март 10, 2011, 12:32 »

не понял, oprator[] же возвражает норм ссылку, а at() конст ссылку.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Март 10, 2011, 12:40 »

Тогда лучше QList агрегировать в свой класс. Не нужно наследоваться от классов, которые не созданы для наследования.
Ну как сказать. С одной стороны вроде да, все можно делать теми "функторами". А с другой - ну так оно неряшливо смотрится, что желание Sasa иметь "человеческий" класс очень понятно. Откуда у Вас взялся CMyClass? Чему он служит кроме "функтора"? Отож.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #13 : Март 10, 2011, 12:46 »

Если наследуешься от класса, который для этого не предназначен, можешь огрести косяков. А на счет неряшливости я что-то совсем не понял. Если именно о "красивости" хедера идет разговор, то лучше всего заюзать пимпл.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #14 : Март 10, 2011, 13:08 »

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


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