Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 02.10.2013
Сообщений: 10

dynamic_cast

31.01.2014, 13:58. Показов 2005. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, возникла проблема. Есть базовый клас CStep. И пока один наследник:
C++
1
class CStepMove : public CStep
Ести вектор указателей:
C++
1
  vector <CStep*> VChangeBack;
Проблема возникает в момент приведения указателей:
C++
1
2
3
4
    CStep* C;
    C = VChangeBack.back();
    CStepMove* A;
    A = dynamic_cast <CStepMove*> C;
Последняя строка выдаёт ошибки: E2276 (expected; и E2379 Statemedt missing;
Не могу понять в чём проблема, аналогичный код видел в других примерах, а написал сам - и не работает...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.01.2014, 13:58
Ответы с готовыми решениями:

dynamic_cast
Помогите разобраться с dynamic_cast, а точнее с вот этой записью void f() { A* pa = new A; B* pb = new B; void* pv =...

dynamic_cast
Уважаемые, подскажите теорию. Как устроен данный каст? Не нашел его определений. В студии он зашит в библиотеку, подсказок в хелпе про него...

Dynamic_cast
#include &lt;iostream&gt; #define STOP cin.get(); using std::cin; using std::cout; class A { public: // void foo()

20
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
31.01.2014, 14:05
Лучший ответ Сообщение было отмечено Андрей1010 как решение

Решение

Возьми C в скобки.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
31.01.2014, 14:06
Скобки поставь.
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
31.01.2014, 14:09
У меня вопрос. А что произойдёт, если сделать A=C просто без явного каста?
0
0 / 0 / 0
Регистрация: 02.10.2013
Сообщений: 10
31.01.2014, 14:12  [ТС]
Спасибо.

Добавлено через 2 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
У меня вопрос. А что произойдёт, если сделать A=C просто без явного каста?
Пишет что не может конвертировать CStep* в CStepMove*.
Дело и впрямь было в скобках)))
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
31.01.2014, 14:30
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А что произойдёт, если сделать A=C просто без явного каста?
Нельзя присваивать указателю на производный класс указатель на базовый.
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
31.01.2014, 14:30
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
 
class A
{
  virtual ~A(){}
};
class B : A{};
 
int main()
{
  A * a = new A;
  B * b = (B*)a;
    
  system("pause>>void");
  return 0;
}
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
31.01.2014, 14:34
egor2116, http://stackoverflow.com/quest... namic-cast
0
 Аватар для egor2116
584 / 387 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
31.01.2014, 14:38
These casts are also called C-style cast.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
31.01.2014, 15:08
egor2116, и мало того, что они так называются, поведения, характерного для dynamic_cast, добиться с помощью C-style каста, нельзя.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
 
struct B
{
    virtual ~B() {}
};
 
struct D : B 
{
};
 
int main() {
    
    B* d = new D;
    B* b = new B;
    
    D* p1 = (D*)b; // Сделает то же, что и reinterpret_cast. Т.е. в результате не nullptr
    std::cout << p1 << std::endl;
    
    D* p2 = dynamic_cast<D*>(b); // Проверит, что b не указывает на экземпляр D и вернет nullptr
    std::cout << p2 << std::endl;
    
    D* p3 = reinterpret_cast<D*>(b); 
    std::cout << p3 << std::endl;   
    
    return 0;
}
http://ideone.com/dvFo2L
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
31.01.2014, 19:18
Цитата Сообщение от egor2116 Посмотреть сообщение
These casts are also called C-style cast.
C-style cast не возвращает указатель на nullptr при неверном касте

Не по теме:

Впрочем, Tulosba все наглядно показал, надо было мне сначала проверить...

0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.01.2014, 20:01
Кстати,так как производится проверки типов у dynamic_cast<> большие затраты.
Так что для прохода по вектору лучше подумать перед тем как использовать.
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
31.01.2014, 20:34
Tulosba, да, я не сразу допёр, что тут кастуется не производный класс к базовому, а наоборот! Тогда вообще непонятна цель этого шаманства.
Обычно мы можем создать контейнер полный указателей base*, а затем пихать в него указатели на различные производные классы. Это позволит нам вызывать по этим указателям виртуальные функции, не задумываясь о конкретном типе объектов.

Но зачем может понадобиться кастовать их назад в конкретный производный тип, если мы только что создали абстрактный интерфейс как раз с противоположной целью!?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
31.01.2014, 21:21
Нужно когда у производного класса есть специфические методы которых нет у базового.

И собственно да предпочтительнее включить этот метод(с пустой реализацией) в базовый класс, нежели кастовать
(но думаю все же это не всегда можно сделать)

Кроме того Майерс советует как вариант распихать объекты по разным контейнерам.

Добавлено через 9 минут
.....
0
0 / 0 / 0
Регистрация: 02.10.2013
Сообщений: 10
07.02.2014, 15:27  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Но зачем может понадобиться кастовать их назад в конкретный производный тип, если мы только что создали абстрактный интерфейс как раз с противоположной целью!?
Понимаете, решение задачи было поставлено так, что если последний объект вектора принадлежит к конкретному классу, то нужно видоизменить этот объект (при определённых условиях), в противном же случае необходимо создать новый объект и добавить указатель на него в вектор.
Проблема, кстати, решена, всё работает. Спасибо за помощь. Вот как заработало.

C++
1
2
3
  vector <CStep*> VChangeBack;  
    CStepMove* A;
    if (A = dynamic_cast <CStepMove*> (VChangeBack.back()))
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.02.2014, 16:25
Если вектор пуст ?

Условия типа if( a = b ) не гуд...
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.02.2014, 16:40
Цитата Сообщение от Avazart Посмотреть сообщение
Если вектор пуст ?
то UB
Цитата Сообщение от Avazart Посмотреть сообщение
Условия типа if( a = b ) не гуд...
в данном случае вполне имеет место быть. Т.к. присваивание со сравнением на nullptr. А внутри блока работаем с A. Правда определение тогда следовало бы тоже в if поместить.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.02.2014, 16:47
Цитата Сообщение от Tulosba Посмотреть сообщение
в данном случае вполне имеет место быть. Т.к. присваивание со сравнением на nullptr. А внутри блока работаем с A. Правда определение тогда следовало бы тоже в if поместить.
А как читается ?

C++
1
2
3
4
5
6
7
8
if( !VChangeBack.empty() )
{ 
   CStepMove* A = dynamic_cast <CStepMove*> (VChangeBack.back());
   if (A)
   {
      A-> ...
   }
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
07.02.2014, 17:48
Цитата Сообщение от Avazart Посмотреть сообщение
А как читается ?
Это же целая лишняя строчка кода.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.02.2014, 17:56
C++
1
CStepMove* A = dynamic_cast <CStepMove*> (VChangeBack.back()); if (A) { A-> ... }
Так лучше ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
07.02.2014, 17:56
Помогаю со студенческими работами здесь

dynamic_cast
#include &lt;iostream&gt; class B { public: virtual void foo(){std::cout&lt;&lt;&quot;B&quot;;} private: int a; }; class D : public B { ...

dynamic_cast() шаблон
Здорова! Пытаюсь свой шаблон функции создать dynamic_cast() это ptr_cast() но ничо не получается. Не могу никак сам шаблон написать ...

Работа с dynamic_cast
Всем привет! Есть Абстрактный класс Transport. Есть три наследника: Plain, Train, Ship. Есть массив указателей на базовый класс который...

Использование dynamic_cast
#include&lt;iostream&gt; #include&lt;locale.h&gt; using namespace std; class Base { public: virtual void f() {}; }; class Der :...

Dynamic_cast реализация
Добрый вечер, есть застоявшаясь фраза: &quot;dynamic_cast&lt;Type*&gt;( pointer ) очень медленное, его лучше не использовать&quot; . Примерная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru