В ролях: от родителя к дочернему классу - PullRequest
0 голосов
/ 31 января 2012

у меня есть 2 класса: hObject, Drawer. Ящик наследуется от hObject.

с помощью этого кода я получаю конкретный объект по id:

hObject * foundObj = hManager::getInstance()->getObject("drawer_id");

Теперь я хочу правильно привести FoundObj из hObject в Drawer. с:

vector<int> points = ((DrawerWidget *)hObject)->getPoints();

я получаю

ожидаемое первичное выражение перед символом) ’

а как насчет динамического приведения?

рассмотрение: мои навыки сократились вдвое, пока я не начал c ++

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Вы случайно написали тип указателя, а не имя:

vector<int> points = ((DrawerWidget *)hObject)->getPoints();
//                                    ^^^^^^^

Вы имели в виду:

vector<int> points = ((DrawerWidget *)foundObj)->getPoints();
//                                    ^^^^^^^^

Также, для великой победы, предпочитайте приведение в стиле C ++:

vector<int> points = (static_cast<DrawerWidget*>(foundObj))->getPoints();

Наконец, если возможно, что *foundObj не на самом деле a DrawerWidget, и если эти типы полиморфны, рассмотрим , а не приведение и использование виртуальной диспетчеризациивместо этого.

3 голосов
/ 31 января 2012

Две проблемы:

  • вы написали hObject (имя типа), когда вы имели в виду foundObj (имя объекта)
  • это указатель, поэтому вам нужноприведение к типу указателя (ОБНОВЛЕНИЕ: вопрос был отредактирован, чтобы исправить это).

Исправляя это, а также используя менее опасное приведение в стиле C ++, должно работать следующее:

vector<int> points = (static_cast<DrawerWidget*>(foundObj))->getPoints();

а как насчет динамического приведения?

Если базовый класс полиморфен (то есть имеет хотя бы одну виртуальную функцию), тогда это будет еще безопаснее - вы можетево время выполнения проверьте, что приведение действительно:

if (DrawerWidget * dw = dynamic_cast<DrawerWidget*>(foundObj)) {
    vector<int> points = dw->getPoints();
} else {
    // not a DrawerWidget
}

, хотя, если вы обнаружите, что делаете это, у меня возникнет мысль о дизайне: может быть, более уместно перепроектировать базовый класс для поддержки того, что вы хотитесделать с помощью виртуальных функций или убедиться, что преобразование действительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...