2016-04-27 6 views
0

私は基本的で簡単な質問があります。内部クラスのデストラクタは、基本クラスのデストラクタの後に呼び出されます

私は、このシナリオがあります。

#include <iostream> 
using namespace std; 

class Inner1 
{ 
public: 
    ~Inner1() {cout << "Inner1 Des\n";}; 
}; 

class Inner2 
{ 
public: 
    ~Inner2() {cout << "Inner2 Des\n";}; 
}; 

class Base 
{ 
public: 
    ~Base() {cout << "Base Des\n";}; 

    Inner1 inner1; 
    Inner2 inner2; 
}; 

int main() { 
    Base base; 
    return 0; 
} 

をそして、私のコンソールには、今、この私に語った:

はと呼ばれる
Inner1デストラクタと呼ばれる
Inner2デストラクタと呼ばれる

ベースデストラクタをこれは正常な行動ですか?いくつかの関数
の機能は、私のベースクラスのデストラクタで既に破壊されているため、内部クラスは に依存しています。

推奨しない回避策:

ちょうど最初の位置にオブジェクトを "デストロイヤー" クラスを追加します。

[...] 
class Base 
    { 
    public: 
     ~Base() {cout << "Base Des\n";}; 

     class Destroyer 
     { 
      ~Destroyer() 
      { 
       //Put the stuff here because this destr will be called last 
       cout << "Destroyer Des\n"; 
      } 
     } _destroyer; 
     Inner1 inner1; 
[...] 

は、このコードを使用してあなたの助け

+0

これらのメッセージを生成するコードを表示する必要があります。さもなければ、我々はその行動をちょうど推測している。 –

+0

これはサブクラスではなく内部クラスです。サブクラス化は継承を意味します。 _その後、派生したクラスのdtorsは、基本クラスのデストラクタの前に呼び出されます。 – Albjenow

+0

これらのメッセージはすべてのデストラクタに追加された標準的なcoutメッセージです。何も特別なものはありません。ちょうどこのシナリオと標準のC + +について私はそれが私の他のコードとtodoは何もないと思う。 – Coda

答えて

1

これは正常な動作ですか?

はい。サブオブジェクトデストラクタは、コンテナクラスのデストラクタによって呼び出されます。特に、サブオブジェクトは、コンテナクラスのデストラクタの本体が実行された後に破棄されます。

の一部の機能は、基本クラスのデストラクタで既に破棄されているため、Innerクラスが依存しているためです。

これは、内部クラスの[sic]デストラクタがそれを含むインスタンスBaseに依存している場合にのみ問題です。その場合、Baseはメンバーとしてそれらを含めるべきではなく、そのデストラクタはBaseに依存すべきではありません。

1

をありがとう:

#include <iostream> 

class Base 
{ 
    public: 
     class Sub1 
     { 
      public: 
       Sub1() 
       { 
        std::cout << "Base::Sub1::Constructed\n"; 
       } 
       ~Sub1() 
       { 
        std::cout << "Base::Sub1::Destroyed\n"; 
       } 
     }; 
     class Sub2 
     { 
      public: 
       Sub2() 
       { 
        std::cout << "Base::Sub2::Constructed\n"; 
       } 
       ~Sub2() 
       { 
        std::cout << "Base::Sub2::Destroyed\n"; 
       } 
     }; 


     Sub1 sub1; 
     Sub2 sub2; 
     Base() 
     { 
      std::cout << "Base::Constructed\n"; 
     } 
     ~Base() 
     { 
      std::cout << "Base::Destroyed\n"; 
     } 
}; 

int main() 
{ 
    Base base; 
} 

私は(adde手動Dコメント)

> ./a.out 
// Build all members first in the order they are declared. 
Base::Sub1::Constructed 
Base::Sub2::Constructed 
// Call the constructor of the object 
Base::Constructed 

// Destruction happens in revers. 
// Calls the destructor code to handle all local resources 
Base::Destroyed 
// Then destroy all members in reverse order of declaration 
Base::Sub2::Destroyed 
Base::Sub1::Destroyed 
+0

ええ、それは私の問題です。このような状況にどう対処するのかアドバイスをいただけますか? – Coda

+2

@Coda:何が問題なのですか?これがC++の定義方法です。 –

+0

私は知っていますが、私はこれについて何ができるのでしょうか " の機能は、私のベースクラスのデストラクタで既に破壊されているため、Innerクラスはそれらに依存しています。 – Coda

0

クラスメンバは、クラスで定義された順序で作成されます。つまり、上記の例で

class Demonstration 
{ 
    XClass x; 
    YClass y; 
}; 

を意味し、xy前に構築されます。破壊が建設の逆の順序で起こるので、yは常にxの前に破壊されます。

関連する問題