Russian Qt Forum

Qt => Общие вопросы => Тема начата: deaks от Ноябрь 13, 2010, 12:04



Название: Массив объектов разных классов
Отправлено: deaks от Ноябрь 13, 2010, 12:04
Здравствуйте!
Имеется задача - есть класс A от него наследуются классы a1, a2, a3...
В свою же очередь существует некий класс B, который включает массив из объектов наследуемых классов класса А.

сейчас у меня примерно такая структура

Код:
class A
{
virtual setMethod() = 0;
}
class a1 : public A
{
virtual setMethod();
...
}
class a2 : public A
{
virtual setMethod();
...
}

массив объявил как QVector<A* > m_arrA и в классе B пишу в него так:

Код:
A* obj_a = new a1();
m_arrA.append((a1*)obj_a);

((a1*)obj_a)->setMethod();

данная штука работает - то есть переходит в конкретный метод наследуемого класса и все пишет.

но как в таком случае можно реализовать get-методы из такого массива?


Название: Re: Массив объектов разных классов
Отправлено: Пантер от Ноябрь 13, 2010, 12:08
Зачем m_arrA.append((a1*)obj_a); если нужно m_arrA.append(obj_a);?
А что тебя смущает с get?


Название: Re: Массив объектов разных классов
Отправлено: deaks от Ноябрь 13, 2010, 12:09
пожалуй я сам разобрался пока писал этот пост)))


Название: Re: Массив объектов разных классов
Отправлено: deaks от Ноябрь 13, 2010, 12:11
Зачем m_arrA.append((a1*)obj_a); если нужно m_arrA.append(obj_a);?

я так делал чтобы можно было в отладчике креатора отследить по вотч листу данный массив.
иначе он состоит из объектов класса A.
хотя мой способ всеравно не работает)))


Название: Re: Массив объектов разных классов
Отправлено: deaks от Ноябрь 13, 2010, 12:19
а чтобы выполнить какое-нибудь действие для элемента такого массива можно обойтись невиртуальным методом?

что-нибудь в таком духе -
Код:
QString tmp_str = ((a1*)m_arrA[i])->getStr();


Название: Re: Массив объектов разных классов
Отправлено: Пантер от Ноябрь 13, 2010, 12:23
А что мешает?

П.С. И используй dynamic_cast вместо сишного приведения. Все таки на плюсах пишешь.


Название: Re: Массив объектов разных классов
Отправлено: deaks от Ноябрь 13, 2010, 12:28
разобрался)просто неверные данные на вход подавал)

как можно в вотч листе креатора отображать наследуемые классы? а то у меня только для базового пишет


Название: Re: Массив объектов разных классов
Отправлено: deaks от Ноябрь 13, 2010, 12:51
П.С. И используй dynamic_cast вместо сишного приведения. Все таки на плюсах пишешь.

я dynamic_cast только при удалении делаю)исправим-с


Название: Re: Массив объектов разных классов
Отправлено: Igors от Ноябрь 13, 2010, 16:56
я dynamic_cast только при удалении делаю)исправим-с
Проще и надежнее объявить деструктор A virtual


Название: Re: Массив объектов разных классов
Отправлено: deaks от Ноябрь 14, 2010, 21:37
я dynamic_cast только при удалении делаю)исправим-с
Проще и надежнее объявить деструктор A virtual

а можно подробней?виртуальный деструктор? Оо


Название: Re: Массив объектов разных классов
Отправлено: Igors от Ноябрь 15, 2010, 14:49
а можно подробней?виртуальный деструктор? Оо
Да уж жевано-пережевано  :) Пример

Код
C++ (Qt)
struct A {
~A( void );        // деструктор не виртуалтный
 ...
};
 
struct A1 : public A {
~A1( void ) { delete data; }
QString * data;
};
 

Теперь если так
Код
C++ (Qt)
A1 * a1 = new A1;
...                      // использование
delete a1;
 
То все нормально, вызовется деструктор A1 (а потом деструктор A)

Но если так
Код
C++ (Qt)
A * a = new A1;
...                      // использование
delete a;
 
То вызовется только деструктор A и a->data удалено не будет (утечка). Поэтому надо объявлять деструктор базового объекта virtual если планируется пользовать указатели на порожденные классы 


Название: Re: Массив объектов разных классов
Отправлено: deaks от Ноябрь 15, 2010, 18:13
вот вы про что) спасибо! =)