2017-01-20 1 views
1

먼저 클래스 자체를 삭제하기 전에 멤버의 소멸자가 호출되어야합니다. 파괴 명령은 일반적으로 역순으로 진행됩니다. 그러나 나는 특별한 경우에 이것을 두드렸다.소멸자 순서 변경

PortA 
PortB 
card 
~card 
~PortB 
~PortA 

하지만이 경우에 필요한 :

// 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; 
}; 

생산하고 그

card 
PortA 
PortB 
~PortB 
~PortA 
~card 

Closse 먼저 포트를 카드 자체 전에. 기본 클래스를 추가

+3

이렇게 순서대로 멤버가있는 컨테이너 클래스를 만듭니다. – BoBTFish

+1

예를 들어 스마트 포인터를 사용할 수 있습니다. 'std :: unique_ptr <>'그리고'Card' 생성자 안에'PortA'와'PortB'를 수동으로 만들고 소멸자에서'.reset()'을 사용하여 자유롭게합니다. – user2807083

+0

두 가지 질문. 첫째, 건설 질서와 다른 파괴 질서에 의지하는 이유는 무엇입니까? 둘째,'PortA'가 구축 된 후에'PortB'의 구축이 실패한 경우 (예를 들어 예외가 발생했을 때)'PortA'가 파괴 될 것으로 예상합니까? – Peter

답변

1

예를 들어, 명시 적으로 조작하는 것이 좋습니다.

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 및 3 개를 모두 래퍼 (wrapper)의 멤버로 둡니다.

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

강력하고 명시적인 파괴가 무엇을 할 것입니다.

포트에 destroy() 메서드를 정의한 다음 카드 소멸자에서 호출합니다.

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; 
} 

당신은 당신이 원하는 것을 얻을 수 있습니다을