2013-03-07 72 views
1

我有一個班AA有它自己的析構函數。如果B使用類A(C++),如何定義類B的析構函數?

我用A定義B如下。

class A{ 
    protected: 
    int* array; 
    public: 
    A(int size){array = new int[size];} 
    ~A() { delete [] array;} 

} 

class B{ 
public: 
    A x; 
} 

我該如何定義B的析構函數?

在此先感謝。

+1

您不需要爲B定義析構函數。B銷燬時,B的成員變量總是被銷燬。 – 2013-03-07 19:39:43

+1

只有當你想讓對象變成多態時,才能讓你的析構函數變爲虛擬。不要盲目地去做。 – 2013-03-07 19:41:26

回答

7

您不必對類B做任何特殊處理。在這種情況下,編譯器生成的析構函數會做正確的事情。

,另一方面類A要麼缺少一個賦值操作符和拷貝構造函數,或者你必須使他們的私人禁用這些。如果複製或分配A實例(因此,一個B實例太多的編譯器生成的會引起問題。見the rule of three

+1

+1爲三的規則。而且,如果你嘗試實例化一個'B'對象,上面的代碼將不會被編譯。 – jerry 2013-03-07 19:55:57

+0

juanchopanza非常感謝。 – xiaohl 2013-03-07 19:57:14

0

你實際上並不需要定義一個析構函數BB沒有任何需要手動清理的成員當B的實例被銷燬時,它的所有成員的析構函數被調用(無論你是否有用戶定義的析構函數),這意味着A的實例被它自己的析構函數清理。默認的析構函數是B完美的罰款。

當然你缺少一個自定義副本constructo r和B的賦值運算符滿足三條規則,但那是另一回事。

+0

你的意思是A,對吧?謝謝,我不知道3的規則。我只是要問這個問題,爲什麼我需要按照juanchopanza的建議來定義構造函數和賦值運算符。 – xiaohl 2013-03-07 19:53:32

0

當編譯器生成調用析構函數(您不需要做任何事情),對於A析構函數會自動被調用。

基本上,在這種情況下,你不需要做任何事情來正確地破壞B.

0

沒有什麼B需要它的析構做。您確實需要爲A定義默認構造函數或在B中調用其現有構造函數的默認構造函數

相關問題