2017-05-15 147 views
0

我想從QObject *強制轉換爲自定義類類型,但應該接受此強制轉換的指針始終爲NULL。qobject_cast返回null

代碼的相關線路:

這是跟投

void CFCInterface::fnAddConn() 
{ 

CFCConnections* f_pConn ; 
f_pConn= new CFCConnections(this); 


QObject* f_pObject = this; 

while(f_pObject) 
{ 
    f_pConn = qobject_cast<CFCConnections*>(f_pObject); 
    if(f_pConn) 
    break; 

    f_pObject = f_pObject->parent(); 

} 
if(f_pConn == 0) 
return; 

}

這被稱爲FCInterface的主要構造函數:

`CFCInterface::CFCInterface(QObject* parent): CInterface(parent), CFCAbstract() 
{ 
    //Some other functions being called 
    fnAddConn(); 

} 

CFCInterface::~CFCInterface() 
{ 

} 
` 

f_pConn保持爲NULL。如果任何人都可以猜測爲什麼這樣,我會有一些領先的跟隨。

僅供參考,我將添加類和頭文件。他們沒有任何功能,除了做這個演員工作。

頁眉:

#include headers 

class CFCConnections: public CResourceItem 
{ 

    Q_OBJECT 

public: 
    CFCConnections(QObject*); 
    ~CFCConnections(); 



}; 


#endif 

類:

#include headers 

CFCConnections::CFCConnections(QObject* parent) : CResourceItem(parent) 
{ 

    //Empty contructor 


} 
CFCConnections::~CFCConnections() 
{ 

} 

PS:我覺得沒有什麼代碼試圖做的是與此有關,但如果你想知道FCInterface是父班級FCC連接。我試圖實現一個樹型列表,其中每個項目都有其自己的類和功能。我正在使用演員陣列在FCInterface下顯示「連接」。

+0

在添加斷點「的QObject * f_pObject =這一點;」,然後檢查一下這個實際上是指向與調試器跟進直到你到鑄造。 – ManuelH

+0

@ManuelH我做到了這一點。 'f_pConn'被初始化爲一個空指針。在你問到的那一行中,'f_pObject'得到_this_的地址。之後,'qobject_cast'失敗,'f_pConn'保持爲空指針。 'f_pObject'獲取父節點的地址,並重新啓動循環。分配給'f_pObject'的地址在每個循環中都會改變,當'f_pObject'變爲空指針時,循環會退出。我沒有得到任何這種行爲 –

回答

0

這很簡單:您執行此操作的對象不是CFConnections的後代。

您需要能夠使用手指指向QObject構造函數調用和/或setParent調用來建立此類父子關係。

你的代碼示例不完整,你有很多不相關的細節。提供一個單個文件示例顯示問題。

+0

謝謝你的答覆。 1.我承認課堂文件是不必要的,但我不知道如何在一個文件中解釋問題。這個代碼在我看來是完整的,這就是爲什麼我對這個問題感到困惑。 2.頭文件中的Q_OBJECT宏應該小心設置父子關係對嗎? –

+0

記住C++是如何工作的。多個文件中的任何代碼都可以壓縮成一個文件。 'Q_OBJECT'宏沒有建立任何種類的父子關係。我已經告訴過你需要建立它:從字面上理解你的手指,指向你傳遞父指針的構造函數,或者你類似地傳遞父指針的'setParent'調用。如果你做不到,它將無法工作。這真的很簡單。沒有什麼。用你的手指指向代碼。如果代碼不存在,寫下它。 –

0

可能的解決方案:

原來的錯誤發生在第一行。我寫了CFCConnections* f_pConn = 0認爲這會爲我做適當的內存分配。 ,改變以下解決了這一問題:

CFCConnections* f_pConn; 
f_pConn = new CFCConnections(this); 
+0

這沒有任何意義。如果你的演員成功了,你在這裏完成的所有事情都是泄漏記憶。也許,就像你上面的例子一樣,沒有足夠的代碼給任何人提供你真正想做的事情的背景。 –

+0

@RetiredNinja如果我最後刪除指針會怎麼樣?我真的不明白我的代碼丟失了什麼?這是一個關於'qobject_cast'應用的問題,你能告訴我什麼上下文會對此有所幫助嗎? –

+0

您已經展示了大約十幾行代碼,大概來自一個函數,但我們不知道該函數的名稱,所需的參數或調用的方式。如果你對你的解決方案感到滿意,我想你可以繼續前進,但我的直覺說這是不正確的,根據你分享的內容,沒有人能告訴你什麼是正確的。有一個原因,我們要求一個完整的例子,而不僅僅是片段。 –