2013-05-09 4 views
0

나는 자식 클래스에 QTableWidgetItem을 캐스팅하기 위해 노력하고있어에 QTableWidgetItem을 주조하는 방법. 그 코드가 이미 작성되어 있기 때문에사용자 정의 자식 클래스

(Parent -> Child) 
QTableWidgetItem -> SortableTableWidgetItem -> EnhancedTableWidgetItem 

또는 대부분의 경우

class SortableTableWidgetItem : public QTableWidgetItem

class EnhancedTableWidgetItem : public SortableTableWidgetItem

, 나는 QTableWidgetItem의 같은 항목을 사용 shouldn : 나는 수업이 같은 계층 구조를 가지고 변화는 없어. 그러나 어떤 경우에 나는 (내가 객체를 구성하고 처음 호출 코드에 전달 때문에 EnhancedTableWidgetItem 알고) QTableWidgetItem에 대한 포인터를 주어진 된 후 EnhancedTableWidgetItem의 데이터에 액세스해야합니다. 나는 이처럼 캐스팅을 시도했다 :

QTableWidgetItem item = getItem(); 

// This fails to compile saying "error: no matching function for call to ‘qobject_cast(QTableWidgetItem*)’" 
EnhancedTableWidgetItem *eItem = qobject_cast<EnhancedTableWidgetItem*>(item); 

// This also fails to compile and says: "error: invalid conversion from ‘QTableWidgetItem*’ to ‘EnhancedTableWidgetItem*’" 
EnhancedTableWidgetItem *eItem = dynamic_cast<EnhancedTableWidgetItem*>(item); 

나는 이것이 완벽하게 합법적이며 항상 수행되는 자바 세상에서왔다. 이유는 아이 클래스 포인터에 기본 클래스 포인터를 캐스팅 수없는 이유는 무엇입니까? 이것을 어떻게 할 수 있습니까?

답변

1

qobject_castQObject에서 상속하는 클래스입니다. item 정말 사용자 정의 형의 경우, 동적 캐스트

EnhancedTableWidgetItem* eItem = dynamic_cast<EnhancedTableWidgetItem*>(item); 

신경 끄시를 사용합니다. 당신은 포인터로 객체를 캐스팅. 작동하지 않습니다. 여전히, 내가 이전에 말한 것은 여전히 ​​적용됩니다.

+0

죄송합니다. 초기 게시물의 포인터를 놓쳤습니다. 그래도 코드에 있습니다. 설명 주셔서 감사합니다! –

+1

포인터를 사용하지 않는 경우 수퍼 클래스를 하위 클래스로 캐스팅하는 것은 정의되지 않은 동작입니다. – UmNyobe

1

포인터와 값이 뒤섞이는군요. 내 생각 엔 당신의 getItem() 값 (복사), 그것은 포인터를 반환하므로이 있어야를 반환하지해야이 :

QTableWidgetItem *item = getItem(); // getItem() returns pointer 
auto eItem = dynamic_cast<EnhancedTableWidgetItem*>(item); 

(당신이 붙어 있다면 훨씬 좋네요 위의 C++ 11의 auto를 사용하지만, 이전 컴파일러를 사용하는 경우 대신 EnhancedTableWidgetItem*을 사용하십시오.)

1

QTableWidgetItem은 QObject에서 파생되지 않으므로 qobject_cast <>을 사용할 수 없습니다.