2017-01-20 17 views
1

我需要的是第一批成員的析構函數的類本身之前調用類的破壞。 我知道破壞順序通常是以相反的順序。但我在特殊情況下對此進行了分析。更改析構函數爲了

// PortA 
class PortA 
{ 
public: 
    PortA()  { cout << " PortA\n"; } 
    ~PortA() { cout << " ~PortA\n"; } 
}; 

// PortB 
class PortB 
{ 
public: 
    PortB()  { cout << " PortB\n"; } 
    ~PortB() { cout << " ~PortB\n"; } 
}; 


class Card 
{ 
public: 
    Card()  { cout << "card\n"; } 
    ~Card()  { cout << "~card\n"; } 


    PortA mPA; 
    PortB mPB; 
}; 

產生:

PortA 
PortB 
card 
~card 
~PortB 
~PortA 

但我需要在這種情況下:

card 
PortA 
PortB 
~PortB 
~PortA 
~card 

Closse第一口卡本身之前。

+3

所以創建具有的順序成員的容器類。 – BoBTFish

+1

您可以使用智能指針,例如'的std ::的unique_ptr <>'和手動創建'PortA'和''PortB'構造Card'和免費使用'.reset段()'中的析構函數 – user2807083

+0

兩個問題的內部。首先,你爲什麼依靠這樣一個不同於施工順序的破壞秩序?其次,如果'PortB'的構造失敗(例如拋出一個異常) - 在'PortA'構建之後 - 你是否期望'PortA'遭到破壞? – Peter

回答

1

考慮操縱它們明確,例如:

class Card 
{ 
public: 
    Card()  
    { 
     cout << "card\n"; 
     mPA = new PortA; 
     mPB = new PortB; 
    } 

    ~Card()  
    { 
     delete mPB; 
     delete mPA; 
     cout << "~card\n"; 
    } 


    PortA *mPA = nullptr; 
    PortB *mPB = nullptr; 
}; 

現在,如果你寫的是這樣的:

{ 
    Card c; 
} 

你會得到你想要的。

2

添加一個基類Card

class BaseCard { 
public: 
    BaseCard() { std::cout << "basecard\n"; } 
    ~BaseCard() { std::cout << "~basecard\n"; } 
}; 

class Card : BaseCard 
{ 
public: 
    Card()  { std::cout << "card\n"; } 
    ~Card()  { std::cout << "~card\n"; } 


    PortA mPA; 
    PortB mPB; 
}; 

擁有BaseCard的構造函數和析構函數調用時您需要:

basecard 
PortA 
PortB 
card 
~card 
~PortB 
~PortA 
~basecard 

或者,你可以解除PortAPortB出來的Card打下三個作爲一個包裝內成員:

class CardWrapper { 
    Card card; 
    PortA mPA; 
    PortB mPB; 
}; 
0

我會做的是一個強大的和明確的破壞。

我將在端口定義destroy()方法,然後會要求他們從卡的析構函數中。