динамический актерский состав не распознает участника

Я работаю над проектом, где у меня есть 2 класса: Room и EventRoom
EventRoom наследуется от Room и имеет еще несколько членов.

В моем коде я делаю это (tmpPtr является Room-указатель):

if(eventRoom)
tmpPtr = dynamic_cast<EventRoom*>(tmpPtr);

и позже, когда я попробую это:

if(line == "false;")
tmpPtr->setComplete(false);

Я получаю ошибки компиляции. SetComplete является участником EventRoom

Укороченная версия: Я хочу создать объекты типа Room, а в некоторых случаях EventRoom. Код в настоящее время работает только для Room, но 90% кода будет идентичным для EventRoom. Любой способ использовать тот же код? (с dynamic_cast или чем-то похожим)

0

Решение

Тебе нужно tmpPtr быть EventRoot указатель.

EventRoom* tmpPtr;

if(eventRoom)
tmpPtr = dynamic_cast<EventRoom*>(tmpPtr);

Вы можете только позвонить Room публичные методы на Room указатель. Вы не можете позвонить EventRoomТолько методы.

3

Другие решения

Код, который должен работать с обоими Room а также EventRoom (то есть он работает только с Room интерфейс), должен работать через статически типизированный указатель Room*,

Код, который использует специфику EventRoom должен работать через статически типизированный указатель EventRoom*, Так пример кода может выглядеть так:

void someFunction(Room *myRoom) {
// doRoomStuff must be a function declared in Room.
myRoom->doRoomStuff();

// Try to determin if the room is an event room or not. This will
// occur at runtime.
EventRoom *myEventRoom = dynamic_cast<EventRoom*>(myRoom);

if (myEventRoom) {
// doEventRoomStuff is a function declared in EventRoom. You cannot call
// myRoom->doEventRoomStuff even if 'myRoom' points to an object that is
// actually an EventRoom. You must do that through a pointer of type
// EventRoom.
myEventRoom->doEventRoomStuff();

// doRoomStuff2 is a function that is declared in Room. Since every
// EventRoom is also a room, every EventRoom can do everything that
// rooms can do.
myEventRoom->doRoomStuff2();
}

myRoom->doRoomStuff3();
}

Вы можете получить доступ Room члены через EventRoom* переменная, но не наоборот.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector