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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Массив объектов разных классов  (Прочитано 7266 раз)
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-методы из такого массива?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #1 : Ноябрь 13, 2010, 12:08 »

Зачем m_arrA.append((a1*)obj_a); если нужно m_arrA.append(obj_a);?
А что тебя смущает с get?
Записан

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

пожалуй я сам разобрался пока писал этот пост)))
Записан
deaks
Гость
« Ответ #3 : Ноябрь 13, 2010, 12:11 »

Зачем m_arrA.append((a1*)obj_a); если нужно m_arrA.append(obj_a);?

я так делал чтобы можно было в отладчике креатора отследить по вотч листу данный массив.
иначе он состоит из объектов класса A.
хотя мой способ всеравно не работает)))
Записан
deaks
Гость
« Ответ #4 : Ноябрь 13, 2010, 12:19 »

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

что-нибудь в таком духе -
Код:
QString tmp_str = ((a1*)m_arrA[i])->getStr();
« Последнее редактирование: Ноябрь 13, 2010, 12:21 от deaks » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


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


Просмотр профиля WWW
« Ответ #5 : Ноябрь 13, 2010, 12:23 »

А что мешает?

П.С. И используй dynamic_cast вместо сишного приведения. Все таки на плюсах пишешь.
« Последнее редактирование: Ноябрь 13, 2010, 12:25 от Пантер » Записан

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

разобрался)просто неверные данные на вход подавал)

как можно в вотч листе креатора отображать наследуемые классы? а то у меня только для базового пишет
Записан
deaks
Гость
« Ответ #7 : Ноябрь 13, 2010, 12:51 »

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

я dynamic_cast только при удалении делаю)исправим-с
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Ноябрь 13, 2010, 16:56 »

я dynamic_cast только при удалении делаю)исправим-с
Проще и надежнее объявить деструктор A virtual
Записан
deaks
Гость
« Ответ #9 : Ноябрь 14, 2010, 21:37 »

я dynamic_cast только при удалении делаю)исправим-с
Проще и надежнее объявить деструктор A virtual

а можно подробней?виртуальный деструктор? Оо
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Ноябрь 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 если планируется пользовать указатели на порожденные классы 
Записан
deaks
Гость
« Ответ #11 : Ноябрь 15, 2010, 18:13 »

вот вы про что) спасибо! =)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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