2013-09-21 31 views
0

我想在類的結構和訪問函數成員中定義類的對象。是否有可能實現這一目標?結構中的類

使用下面的代碼,我得到ps_test->AttachToInput(2145);的分段錯誤。我想不通的原因,一切看起來正確的對我說:

class test 
{ 
public: 
    test(); 
    virtual ~test(); 
    int init_app(int argc, char* argv[]); 
    virtual void AttachToInput(int TypeNumber, int DeviceNo=0); 
} 

struct capture 
{ 
    test h_app; 
    gint port; 
}; 

main() 
{ 
    struct capture h_cap; 
    test *ps_test = &h_cap.h_app; 
    ps_test->AttachToInput(2145); 
} 
+1

您遇到過什麼問題? –

+7

您不能調用'AttachToInput',因爲它是受保護的,所以只有派生類可以使用它。 (它的工作方式與Java中的不同。)這是你的問題嗎? –

+0

「我有一個獨特的」!? –

回答

4

首先,一個class並在C struct ++之間唯一的區別是,一個類的成員private默認和結構的成員默認爲public。編譯器生成的計數器和計數器在兩種情況下均可見 - 除非程序員另有說明(例如,它們將默認計數器移動到private部分中)。否則,在沒有明確的公共聲明的情況下,構建和銷燬標記爲class的用戶定義類型的實例是不可能的 - 因此無法實現編譯器生成函數的目的。

所以基本上,你在你的例子中做的只是組成兩個用戶定義類型,這是完全合法的。當您創建capture的實例時,也會創建一個test的實例。

不能做的是從公開的test外部訪問AttachToInput()派生類型test。您需要聲明函數public爲了使該行編譯:

h_cap.h_app.AttachToInput(); // error: member function of `test` is protected 

在其它不相關的說明(但我碰到它,所以我提到它),你class test持有原始指針char。如果被指向的實體的生存期保證超過持有該指針的對象的生存期,則保持原始指針是可以的。否則,該對象本身很可能負責銷燬該實體。你需要確定誰擁有什麼以及誰負責分配和重新分配東西。

編輯:應該指出,艾倫斯托克斯在評論部分提出了同樣的建議,當我寫這個答案。 :)

EDIT2:輕微的監督,隱含的默認權限也會承擔這取決於如何派生類被聲明爲基類。請參閱What are the differences between struct and class in C++?

+0

Hello Thokra, 感謝您的幫助。它澄清了我的大部分疑問。我已經更新了我的問題。你可以看看它並幫我解決這個問題。美好的一天。 – Raju

+0

@RajuBabannavar:你得到的段錯誤不是由於對'AttachToInput()'的調用。我建議你調試該函數的實現並確保它不訪問無效地址。使用'AttachToInput()'的存根實現,您的示例可以正常工作 - 因爲它應該。 – thokra