C ++: недопустимое преобразование из BaseNode * в Match * - PullRequest
2 голосов
/ 04 декабря 2008

Все объекты в моей программе наследуются от класса Container. Класс Container имеет метод virtual BaseNode* getParent() const; и метод virtual void setParent(BaseNode *p);.

У меня есть класс Set (установленный в теннисном матче, а не структура данных), у которого класс Match является родительским (через setParent()), но поскольку Set наследуется от Container, Программа создает древовидную структуру сверху вниз, а класс Set является дочерним, ей не нужно иметь методы для отслеживания и поддержки информации о своем родителе, помимо того, что предоставляет Container.

Ошибка C++: invalid conversion from ‘BaseNode*’ to ‘Match*’ появляется в методе ниже, когда я пытаюсь скомпилировать свою программу. (Player* getPlayer1() const; существует только в классе Match)

Player* Set::getPlayer1() const{
    return getParent()->getPlayer1();
}

Это моя структура наследования для Match. (Обратите внимание, что TreeNode является шаблоном)

Match -> TreeNode<Set> -> BaseNode -> Container

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

Редактировать

Player* Set::getPlayer1() const{
    return dynamic_cast<Match>(getParent())->getPlayer1();
}

1031 * вызывает *

error: cannot dynamic_cast ‘#‘obj_type_ref’ not supported by dump_expr#<expression error>((&((const Set*)this)->Set::<anonymous>))’ (of type ‘class BaseNode*’) to type ‘class Match’ (target is not pointer or reference)

Редактировать 2

Я только что понял, что мне нужно dynamic_cast<Match*>, который работает.

Ответы [ 2 ]

3 голосов
/ 04 декабря 2008

Проблема в том, что getParent() возвращает BaseNode*, который может быть указателем на любой тип BaseNode - это может указывать на несвязанный класс, который также является производным от BaseNode. Если вы на 100% уверены, что родитель должен иметь тип Match, вы должны сначала преобразовать родителя в Match*, а затем вы можете вызвать getPlayer() для этого:

Player* Set::getPlayer1() const{
    return dynamic_cast<Match*>(getParent())->getPlayer1();
}

Если родитель не нужен Match, тогда dynamic_cast может вернуть NULL, поэтому обязательно проверьте это.

1 голос
/ 04 декабря 2008

Я думаю, что вам действительно нужно реорганизовать иерархию и имена методов ... Это не имеет никакого отношения к вашему вопросу, но в целом трудно понять, почему Set наследуется от Match. (разве у спички нет наборов?)

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

Вы, вероятно, должны структурировать его ближе к реальному миру.

только мои $ .02

EDIT

Я бы, вероятно, имел объект Match, который содержит карту наборов (карта, т.е. набор один, два, три и т. Д.) И метод Player (int), а не Player1 () и player2 (). Также нет необходимости иметь метод для игрока в классе Set. Набор будет указывать на матч, в котором он играет.

...