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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QList<A*> преобразовать в QList<B*>  (Прочитано 6055 раз)
ltise
Гость
« : Август 12, 2010, 17:47 »

Подскажите плиз:

есть 2 класса:

class A{};

class B : public A{}

некоторая функция возвращает результат в списке

QList<A*>

но я знаю, что в списке одни потомки B...

можно как-нить преобразовать QList<A*> в QList<B*> ?

спасибо
Записан
BRE
Гость
« Ответ #1 : Август 12, 2010, 17:53 »

А для чего?
Чего хочешь добиться?
Записан
ltise
Гость
« Ответ #2 : Август 12, 2010, 18:25 »

А для чего?
Чего хочешь добиться?

избавиться от необходимости в цикле использовать static_cast

QList<A*> lista = someFunc();
foreach(A* a, lista){
    B * b = static_cast<B*>(a);
    b.blalalalalal()
    ....
}
Записан
BRE
Гость
« Ответ #3 : Август 12, 2010, 18:30 »

избавиться от необходимости в цикле использовать static_cast
Так может попробовать просто:
Код
C++ (Qt)
class A
{
public:
virtual void blabla() {}
};
 
class B : public A
{
public:
virtual void blabla() { ... }
};
 
QList<A*> lista = someFunc();
foreach(A* a, lista){
   a->blabla();
   ....
}
 
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Август 12, 2010, 18:30 »

ltise, только так и делать, с циклом.
Записан

Юра.
ltise
Гость
« Ответ #5 : Август 12, 2010, 18:34 »

Я понял - вощем заморочка Улыбающийся, буду преобразовывать в цикле, где возможно прописывать виртуальные методы...

спасибо
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #6 : Август 12, 2010, 20:33 »

я думаю, можно сделать шаблонную функцию
Записан

Юра.
ltise
Гость
« Ответ #7 : Август 12, 2010, 20:39 »

Получилось след. образом:

Код:
QList<A*> lista;
..
..
..
QList<B*> * listb = (QList<B*>*)(&lista);

даже работает Улыбающийся
могут быть какие-нить грабли ?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Август 12, 2010, 20:54 »

Х.З., тестируй
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 12, 2010, 22:21 »

Получилось след. образом:

Код:
QList<A*> lista;
..
..
..
QList<B*> * listb = (QList<B*>*)(&lista);

даже работает Улыбающийся
могут быть какие-нить грабли ?
Это будет работать но такое "насильное" приведение показывает что спроектировано плохо. Ваш QList обязан содержать только указатели на объекты класса "B", иначе рухнет на выполнении. Зачем тогда было притворяться и объявлять его как QList<A*> ?
Записан
ltise
Гость
« Ответ #10 : Август 12, 2010, 23:05 »


Это будет работать но такое "насильное" приведение показывает что спроектировано плохо. Ваш QList обязан содержать только указатели на объекты класса "B", иначе рухнет на выполнении. Зачем тогда было притворяться и объявлять его как QList<A*> ?

Ситуация:

private:
    QMultiMap<Key*, A*> _data;

известно, что по  Key keyB массив содержит только типы B.

Но, значения могут быть выбраны только как QList<A*>

QList<A*> listb = data.values(&keyB);

допустим необходимо сделать 2 метода:

QList<A*> getAllA(){
    QList<A*> lista = data.values(&keyA);
    return lista;
}

QList<B*> getAllB(){
    QList<A*> listb = data.values(&keyB);
    return Непонимающий?
}


Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Август 13, 2010, 14:51 »

Код
C++ (Qt)
QList<B *> getAllB( void )
{
   QList<B *> lstB;
   QList<A *> lstA = data.values(&keyB);
   for (int i = 0; i < lstA.size(); ++i) {
     B * val = dynamic_cast <B *> (lstA[ i ]);
     if (val)
      lstB.push_back(val);
   }
   return lstB;
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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