2013-01-16 101 views
0

你如何測試一個對象,看它是否有某個成員?或者有沒有辦法查看某個對象是否是某個類的實例?C++如何測試一個類,看它是否有成員?

我正在使用字符圖片的繼承結構。有String_Pics,HCat_Pics,VCat_Pics和Frame_Pics。它們都來自Pic_Base。用戶使用包含指向對象的智能指針的句柄類「圖片」。每個對象都存儲一個指向基於它的圖片的指針(另一圖片的幀,水平連接的兩張圖片等)。例如:圍繞VCat-Pic的Frame-Pic,並且VCat-Pic中的兩個圖片都是圍繞String_Pics的Frame_Pics。

*************** 
*    * 
* *********** * 
* * This * * 
* * is  * * 
* *********** * 
* *********** * 
* * The  * * 
* * Example * * 
* *********** * 
*    * 
*************** 

Frame_Pics具有「幀字符」的數據成員,但沒有其他類。我正在寫一個函數,遞歸地更改結構中每個幀的幀字符。也許我錯過了一種方式來做到這一點,否則,我正在尋找一種方法來測試我正在處理的對象是否是Frame_Pic,因此是否意味着要嘗試更改幀字符。

我的第一個直覺是嘗試類似if (p->frame_char)其中frame_char是Frame_Pic的數據成員之一的名稱,但我不知道如何做到這一點。

+0

這已被問了很多次,以下是一個美麗的解決方案的例子:http://stackoverflow.com/questions/257288/is-it-possible-to-write-ac-template-to-check- for-a-functions-existence –

+1

@AdamCadien我相信這是一個編譯時解決方案嗎?看起來像OP需要運行時。 –

+0

是的,我的壞!感謝您指出了這一點。 –

回答

2

您可以嘗試動態地將指針轉到Frame_pic並查看它是否返回非空值。

Frame_Pic *frame =dynamic_cast<Frame_Pic*>(p); 
if(frame != nullptr){ 
    //It is Frame_Pic 
    frame->frame_char; 
} 

不是一個好主意要走的路cast雖然..試着寫一個廢除需要它的虛函數。

+0

是的,虛擬功能是要走的路。 –

+0

@AndyIsbell很棒,你可以修復設計 –

1

原來我真的不需要直接測試會員資格。這實際上是一個非常適合多態性的問題:

我在Pic_Base中聲明瞭一個virtual函數「reframe」,並定義了「frame」的版本以更改字符,並且定義了其他類的遞歸通過的版本根據需要嵌套圖片。

相關問題