Форум программистов, компьютерный форум CyberForum.ru

dynamic_cast - C++

Восстановить пароль Регистрация
 
 
Андрей1010
0 / 0 / 0
Регистрация: 02.10.2013
Сообщений: 10
31.01.2014, 13:58     dynamic_cast #1
Подскажите пожалуйста, возникла проблема. Есть базовый клас 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;
Не могу понять в чём проблема, аналогичный код видел в других примерах, а написал сам - и не работает...
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.01.2014, 13:58     dynamic_cast
Посмотрите здесь:

dynamic_cast C++
dynamic_cast C++
dynamic_cast() шаблон C++
dynamic_cast C++
C++ Объясните dynamic_cast
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
31.01.2014, 14:05     dynamic_cast #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Возьми C в скобки.
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
31.01.2014, 14:06     dynamic_cast #3
Скобки поставь.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
31.01.2014, 14:09     dynamic_cast #4
У меня вопрос. А что произойдёт, если сделать A=C просто без явного каста?
Андрей1010
0 / 0 / 0
Регистрация: 02.10.2013
Сообщений: 10
31.01.2014, 14:12  [ТС]     dynamic_cast #5
Спасибо.

Добавлено через 2 минуты
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
У меня вопрос. А что произойдёт, если сделать A=C просто без явного каста?
Пишет что не может конвертировать CStep* в CStepMove*.
Дело и впрямь было в скобках)))
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.01.2014, 14:30     dynamic_cast #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
А что произойдёт, если сделать A=C просто без явного каста?
Нельзя присваивать указателю на производный класс указатель на базовый.
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
31.01.2014, 14:30     dynamic_cast #7
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;
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.01.2014, 14:34     dynamic_cast #8
egor2116, http://stackoverflow.com/questions/2...s-dynamic-cast
egor2116
 Аватар для egor2116
337 / 368 / 42
Регистрация: 20.01.2013
Сообщений: 1,100
31.01.2014, 14:38     dynamic_cast #9
These casts are also called C-style cast.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
31.01.2014, 15:08     dynamic_cast #10
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
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4927 / 2670 / 243
Регистрация: 29.11.2010
Сообщений: 7,429
31.01.2014, 19:18     dynamic_cast #11
Цитата Сообщение от egor2116 Посмотреть сообщение
These casts are also called C-style cast.
C-style cast не возвращает указатель на nullptr при неверном касте

Не по теме:

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

Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
31.01.2014, 20:01     dynamic_cast #12
Кстати,так как производится проверки типов у dynamic_cast<> большие затраты.
Так что для прохода по вектору лучше подумать перед тем как использовать.
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
31.01.2014, 20:34     dynamic_cast #13
Tulosba, да, я не сразу допёр, что тут кастуется не производный класс к базовому, а наоборот! Тогда вообще непонятна цель этого шаманства.
Обычно мы можем создать контейнер полный указателей base*, а затем пихать в него указатели на различные производные классы. Это позволит нам вызывать по этим указателям виртуальные функции, не задумываясь о конкретном типе объектов.

Но зачем может понадобиться кастовать их назад в конкретный производный тип, если мы только что создали абстрактный интерфейс как раз с противоположной целью!?
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
31.01.2014, 21:21     dynamic_cast #14
Нужно когда у производного класса есть специфические методы которых нет у базового.

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

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

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

C++
1
2
3
  vector <CStep*> VChangeBack;  
    CStepMove* A;
    if (A = dynamic_cast <CStepMove*> (VChangeBack.back()))
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
07.02.2014, 16:25     dynamic_cast #16
Если вектор пуст ?

Условия типа if( a = b ) не гуд...
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.02.2014, 16:40     dynamic_cast #17
Цитата Сообщение от Avazart Посмотреть сообщение
Если вектор пуст ?
то UB
Цитата Сообщение от Avazart Посмотреть сообщение
Условия типа if( a = b ) не гуд...
в данном случае вполне имеет место быть. Т.к. присваивание со сравнением на nullptr. А внутри блока работаем с A. Правда определение тогда следовало бы тоже в if поместить.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
07.02.2014, 16:47     dynamic_cast #18
Цитата Сообщение от 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-> ...
   }
}
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
07.02.2014, 17:48     dynamic_cast #19
Цитата Сообщение от Avazart Посмотреть сообщение
А как читается ?
Это же целая лишняя строчка кода.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2014, 17:56     dynamic_cast
Еще ссылки по теме:

C++ Ошибка dynamic_cast: __non_rtti_object
Dynamic_cast и полиморфизм C++
C++ Работа с dynamic_cast

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

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
07.02.2014, 17:56     dynamic_cast #20
C++
1
CStepMove* A = dynamic_cast <CStepMove*> (VChangeBack.back()); if (A) { A-> ... }
Так лучше ?
Yandex
Объявления
07.02.2014, 17:56     dynamic_cast
Ответ Создать тему
Опции темы

Текущее время: 01:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru