"스마트"맵 요소를 나타내는 일련의 클래스가 있습니다 : 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_);
}
올바른 캐스트는 무엇입니까? 아니면 완전히 잘못된 방향으로 가고 있습니까?
은 QGraphicsItem과 MapElementInterface가 관련이 없으므로 클래스 계층 구조 전체에 수평으로 캐스트 할 수 없습니다. 파생 된 유형으로 다시 캐스트 한 다음 다시 내려야합니다 (dynamic_cast 사용). –
@Martin : 직접적인 dynamic_cast를 사용하여 * 작동하는 것 같습니다. 저에게 당신이 예상하고있는 문제 또는 "어려움"을보다 자세하게 설명하는 온라인 기사를 가르쳐 주시겠습니까? 감사! –
'QGraphicsItem 및 MapElementInterface'와 관련이없는 두 가지 유형간에 동적 캐스팅을 시도하면 NULL 포인터가 반환됩니다. 그러므로 당신은 다른 것을하고 있거나 아니면 그 둘 사이에 어떤 관계가 있습니다. 계층을 위쪽으로 캐스팅 (dynamic_cast) 한 다음 계층을 아래로 내림으로써 만 하나에서 다른쪽으로 캐스트 할 수 있습니다. 다른 캐스트 (rinterpret_cast)를 사용하는 경우 정의되지 않은 영역에 있습니다. –