Russian Qt Forum

Qt => Общие вопросы => Тема начата: ltise от Август 12, 2010, 17:47



Название: QList<A*> преобразовать в QList<B*>
Отправлено: ltise от Август 12, 2010, 17:47
Подскажите плиз:

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

class A{};

class B : public A{}

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

QList<A*>

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

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

спасибо


Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: BRE от Август 12, 2010, 17:53
А для чего?
Чего хочешь добиться?


Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: ltise от Август 12, 2010, 18:25
А для чего?
Чего хочешь добиться?

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

QList<A*> lista = someFunc();
foreach(A* a, lista){
    B * b = static_cast<B*>(a);
    b.blalalalalal()
    ....
}


Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: BRE от Август 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();
   ....
}
 


Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: lit-uriy от Август 12, 2010, 18:30
ltise, только так и делать, с циклом.


Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: ltise от Август 12, 2010, 18:34
Я понял - вощем заморочка :), буду преобразовывать в цикле, где возможно прописывать виртуальные методы...

спасибо


Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: lit-uriy от Август 12, 2010, 20:33
я думаю, можно сделать шаблонную функцию


Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: ltise от Август 12, 2010, 20:39
Получилось след. образом:

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

даже работает :)
могут быть какие-нить грабли ?


Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: lit-uriy от Август 12, 2010, 20:54
Х.З., тестируй


Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: Igors от Август 12, 2010, 22:21
Получилось след. образом:

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

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


Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: ltise от Август 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 ????
}




Название: Re: QList<A*> преобразовать в QList<B*>
Отправлено: Igors от Август 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;
}