2010-07-13 5 views
4

"스마트"맵 요소를 나타내는 일련의 클래스가 있습니다 : MapTextElement, MapIconElement 등이 있습니다. 클래스는 다양한 Qt 그래픽 항목 클래스를 확장하지만 공통 기능 (예 : 각 클래스에 대해 특수화 된 속성 패널을 반환하는 추상 팩터 리 메서드) 순수 가상 클래스 인 MapElementInterface에서 이러한 일반적인 메소드를 선언했습니다. 내 수업 후 적절한 Qt는 기본 클래스를 다중 - 상속뿐만 아니라 인터페이스 :C++ : 기본 클래스의 일부가 아닌 인터페이스로 캐스팅

class MapTextElement : public QGraphicsTextItem, public MapElementInterface 
class MapIconElement : public QGraphicsItem, public MapElementInterface 

그래서 내 클래스 계층 구조는 종류 등으로 같습니다

  +-------------+ +-------------------+ 
     |QGraphicsItem| |MapElementInterface| 
     +-------------+ +-------------------+ 
       ^    ^^
       |     | | 
     +------+------+   | |  
     |    |   | | 
+-----------------+ +--------------+ | 
|QGraphicsTextItem| |MapIconElement| | 
+-----------------+ +--------------+ | 
    ^        | 
    |         | 
    +-------------------+  +-----+ 
         |  | 
         +--------------+ 
         |MapTextElement| 
         +--------------+ 

난에서 QGraphicsItem에 대한 포인터를 수신하고 Qt 제공 방법. 이 경우, 은 포인터가 QGraphicsItem 일뿐만 아니라 MapElementInterface 일뿐만 아니라을 알고 있습니다. 포인터를 MapElementInterface으로 처리하고 싶습니다.

QList<QGraphicsItem*> selected = scene_->selectedItems(); 
if (selected.count() == 1) { 
    // We know that the selected item implements MapEditorInterface 
    MapElementInterface *element = SOME_CAST_HERE<MapElementInterface*>(selected[0]); 
    QWidget *panel = element->GeneratePropertyPanel(property_dock_); 
} 

올바른 캐스트는 무엇입니까? 아니면 완전히 잘못된 방향으로 가고 있습니까?

+0

은 QGraphicsItem과 MapElementInterface가 관련이 없으므로 클래스 계층 구조 전체에 수평으로 캐스트 할 수 없습니다. 파생 된 유형으로 다시 캐스트 한 다음 다시 내려야합니다 (dynamic_cast 사용). –

+0

@Martin : 직접적인 dynamic_cast를 사용하여 * 작동하는 것 같습니다. 저에게 당신이 예상하고있는 문제 또는 "어려움"을보다 자세하게 설명하는 온라인 기사를 가르쳐 주시겠습니까? 감사! –

+0

'QGraphicsItem 및 MapElementInterface'와 관련이없는 두 가지 유형간에 동적 캐스팅을 시도하면 NULL 포인터가 반환됩니다. 그러므로 당신은 다른 것을하고 있거나 아니면 그 둘 사이에 어떤 관계가 있습니다. 계층을 위쪽으로 캐스팅 (dynamic_cast) 한 다음 계층을 아래로 내림으로써 만 하나에서 다른쪽으로 캐스트 할 수 있습니다. 다른 캐스트 (rinterpret_cast)를 사용하는 경우 정의되지 않은 영역에 있습니다. –

답변

3

다중 상속을 사용하는 경우 dynamic_cast가 유일한 방법이며 NULL에 대해 반환 값을 확인하십시오.

2

당신은 당신의 포인터가 MapTextElement 또는 MapIconElement 중 하나를 가리 수있는 다이어그램을 제공하기 때문에, 여기에 조심해야합니다. 여기에 대한 유일한 안전한 내기는 동적 주조로가는 것입니다. 또는 객체의 유형을 파악할 수있는 또 다른 방법을 제공하십시오.

1

MapIconElement, MapElementInterface로 캐스팅하거나 MapTextElement로 캐스팅 한 다음 MapElementInterface로 캐스팅 할 수 있습니다. 경로를 선택해야합니다 (또는 경로를 확인하기 위해 동적 다운 캐스트).

+0

당신은 분명히 할 수 있습니까? MapElementInterface로 직접 형변환 할 방법이 없다고 말하는가? 그렇다면 MapElementInterface의 새로운 구체적인 클래스를 추가 할 때마다 내 코드에 다른 'if'경로를 추가해야합니다.냄새가 나고 인터페이스의 목적을 크게 뒤엎습니다. –

+0

정확히. dynamic_cast를 아래로 (실제로는 차갑게) 보내거나 MapElementInterface를 QGraphicsItem의 파생 클래스로 변환해야합니다. 또는 MapElementInterface 상속을 ... Element 요소로 바꿀 수도 있습니다. –

+0

'dynamic_cast'가 나를 위해 일하는 것 같습니다. 그래서 당신이 묘사하고있는 문제에 부딪쳐서는 안됩니다. 어쨌든 도와 줘서 고마워! –

관련 문제