2012-11-28 1 views
0

두 개의 클래스가있는 프로젝트에서 작업하고 있습니다. Room 및 EventRoom EventRoom이 방을 상속하고 더 많은 멤버가 있습니다. 내 코드에서동적 캐스트가 멤버를 인식하지 못합니다.

나는 (tmpPtr 방 포인터입니다) 이렇게 :

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

나중에 내가이하려고하면

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

내가 컴파일 오류를 얻을. setComplete는 EventRoom

짧은 버전의 회원입니다 : 내가 형 룸의 객체를 생성 할, 어떤 경우에는 EventRoom. 이 코드는 현재 Room에서만 작동하지만 코드의 90 %는 EventRoom과 동일합니다. 동일한 코드를 사용하는 방법은 무엇입니까? (dynamic_cast 또는 유사한 것으로)

답변

3

EventRoot 포인터가 되려면 tmpPtr이 필요합니다.

EventRoom* tmpPtr; 

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

당신은 단지 Room 포인터 Room public 메소드를 호출 할 수 있습니다. 오직 EventRoom - 유일한 방법으로 전화 할 수 없습니다.

+0

그렇다면 객실에서도 사용할 수 있습니까? 아니면 내가 각 점막에 대해 2 개의 다른 포인터가 필요할 것인가? –

+0

@ 예 아니요. 예, EventRoom은 ** '방'이기 때문에 '방'에 사용할 수 있습니다. – juanchopanza

+0

@juanchopanza "Room"과 함께 작업하는 것이 무엇을 의미하는지에 따라 달라집니다. " 'EventRoom *'에'Room * '을 넣는 것은 불가능합니다 (캐스트없이). – Angew

1

(즉, 그것은 단지 Room 인터페이스와 함께 작동) RoomEventRoom 모두에서 작동하는 코드, 포인터를 통해 작동하는 정적 Room*를 입력했습니다.

EventRoom의 사양을 사용하는 코드는 정적으로 입력 된 포인터 EventRoom*을 사용해야합니다. 그래서 예제 코드는 다음과 같을 수 있습니다 : 당신이하지 그 반대의 경우도 마찬가지 EventRoom* 변수를 통해 Room 멤버에 액세스 할 수 있지만

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(); 
} 

.

+0

이것은 훌륭한 게시물이었습니다. 매우 비슷한 것을 쓰고 있었지만, 게시물을 본 후에 편집하여 코드에 주석을 추가하여 좀 더 강조했습니다. –

+0

@NikBougalis 편집 해 주셔서 감사합니다. – Angew