Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Наследование: перевод туда и обратно, Массив разных типов 
V
    Опции темы
DeXPeriX
Дата 7.11.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.9.2008
Где: http://dexperix.n et

Репутация: нет
Всего: нет



Имеется класс "балка". К балке могут быть применены различные нагрузки. Например, классы "Сила" и "Крутящий момент" наследуются от класса "Нагрузка".  У каждого из классов "Сила" и "Крутящий момент" свой метод прорисовки. 
Хочется сделать что-то типа:
for(i=0; i<кол-во_нагрузок; i++)
  нагрузка[i]->draw();
Естественно, в зависимости от типа нагрузки иногда нужно обращаться и к специфичным полям именно этого типа нагрузки. 
"Сила" и "Крутящий момент" легко приводятся к типу "Нагрузка" и пихаются в массив. А вот как их взять обратно? Если нельзя - то как лучше решить мою задачу?
PM MAIL WWW ICQ Skype Jabber   Вверх
Daevaorn
Дата 7.11.2008, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(DeXPeriX @  7.11.2008,  14:55 Найти цитируемый пост)
Естественно, в зависимости от типа нагрузки иногда нужно обращаться и к специфичным полям именно этого типа нагрузки. 

Вот тут концептуальная ошибка. Надо избавляться от обращения к полям. В идеале они все должны быть private.
PM MAIL WWW   Вверх
mes
Дата 7.11.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



сделать метод draw виртуальным и перопределить его в наследниках. 


--------------------
PM MAIL WWW   Вверх
DeXPeriX
Дата 7.11.2008, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.9.2008
Где: http://dexperix.n et

Репутация: нет
Всего: нет



Они и есть private smile Обращаться пытаюсь через геттер, специфичный для силы:

Workload *tempObj;
tempObj = new Force();
//curValue = static_cast<Force>(tempObj)->getValue();
curValue = tempObj->getValue();

error: ‘class Workload’ has no member named ‘getValue’

Метод draw у всех и так переопределён

Добавлено через 12 минут и 2 секунды
В общем, получается что задача сводится к приведению типа от родителя к ребёнку. Такое в С++ возможно?

Это сообщение отредактировал(а) DeXPeriX - 7.11.2008, 14:09
PM MAIL WWW ICQ Skype Jabber   Вверх
DeXPeriX
Дата 7.11.2008, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.9.2008
Где: http://dexperix.n et

Репутация: нет
Всего: нет



beams[curBeam]->tempObj = new Force();
//Force* tf = dynamic_cast<Force>(beams[curBeam]->tempObj);
Force* tf = (Force) beams[curBeam]->tempObj;
tmp = tf->getValue();

painter.cpp: In constructor ‘Painter::Painter()’:
painter.cpp:23: error: no matching function for call to ‘Force::Force(Workload*&)’
force.h:21: note: candidates are: Force::Force()
force.h:12: note:                 Force::Force(const Force&)
PM MAIL WWW ICQ Skype Jabber   Вверх
mes
Дата 7.11.2008, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(DeXPeriX @  7.11.2008,  14:06 Найти цитируемый пост)
В общем, получается что задача сводится к приведению типа от родителя к ребёнку. Такое в С++ возможно?

возможно. но зачастую есть более удачные решения..

Добавлено через 1 минуту и 18 секунд
вот набросал в другой теме примерчик.. может и Вам подойдет :
http://forum.vingrad.ru/index.php?showtopi...t&p=1691597


--------------------
PM MAIL WWW   Вверх
DeXPeriX
Дата 7.11.2008, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.9.2008
Где: http://dexperix.n et

Репутация: нет
Всего: нет



Вот тут и спрашиваю: какое решение может быть более удачным ? smile Или как хотя бы приведение типа заставить работать....
PM MAIL WWW ICQ Skype Jabber   Вверх
mes
Дата 7.11.2008, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(DeXPeriX @  7.11.2008,  14:52 Найти цитируемый пост)
ли как хотя бы приведение типа заставить работать.... 

Код

   Base *  pbase = new Derived;
   Derived *p = dynamic_cast<Derived*>(pbase);


Цитата(DeXPeriX @  7.11.2008,  14:52 Найти цитируемый пост)
Вот тут и спрашиваю: какое решение может быть более удачным ?

Visitor приведенный в примере по ссылке в предыдущем посте.


Это сообщение отредактировал(а) mes - 7.11.2008, 15:04


--------------------
PM MAIL WWW   Вверх
DeXPeriX
Дата 7.11.2008, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 5.9.2008
Где: http://dexperix.n et

Репутация: нет
Всего: нет



Great thanks! 
Забыл метод виртуальным сделать  smile 
PM MAIL WWW ICQ Skype Jabber   Вверх
mes
Дата 7.11.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(DeXPeriX @  7.11.2008,  15:24 Найти цитируемый пост)
забыл метод виртуальным сделать  smile 

Цитата(Крылов И.А.)

А ларчик просто открывался
 smile 

Это сообщение отредактировал(а) mes - 7.11.2008, 16:01


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0877 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.