2012-03-23 3 views
0
#include <iostream> 

using namespace std; 

class A{ 
    int b; 
public: 
    A(){ 
     cout<<"Constructor for class A called\n"; 
     b = 6; 
    } 
    ~A(){ 
     cout<"Destructor called for class A\n"; 
    } 
}; 

class B{ 
    A a; 
public: 
    B(){ 
     cout<<"Constructor for class B called\n"; 
    } 
    ~B(){ 
     cout<<"Destructor called for class B\n"; 
    } 
}; 


int main(void){ 
    B obj1; 
    return 0; 
} 

が予想と呼ばれるが、即ちOBJ1 Bのオブジェクトが範囲外になったときのみBのデストラクタが呼び出されます。 AのobjがBのメンバーの1つであるにもかかわらず、なぜAのデストラクタが呼び出されないのですか?デストラクタコール

+0

@Nawaz返信ありがとうございます。これが元のコードです。 Aのデストラクタは呼び出されません。 – niting112

+0

Aのデストラクタは間違いなく呼び出されます。あなたのコードはコンパイルされません。〜A()を参照してください。 – juanchopanza

+0

@juanchopanzaはい、それは呼び出されます。しかし、VS2010は単一の '<'を使用するとエラーをスローしませんでした。 – niting112

答えて

5

あなたがAのデストラクタで<を逃している:

cout << "Destructor called for class A\n"; 

あなたが表現のためにコンパイルエラーを取得していない場合:

cout < "Destructor called for class A\n" 
     | 
//less than operator 

だけでなく、あなたのコンパイラはcoutを比較しようとしていますconst char*へ。それは奇妙なことです。しかし、残念ながら、<<<を変更し、それが動作するはずです:与えられたとcoutの比較:http://ideone.com/8TDyy

+0

ありがとうございます。不注意な間違いで申し訳ありません。しかし、なぜコンパイラがエラーをスローしないのだろうかと思っています – niting112

+0

@ niting112私は好奇心が強いです、どのコンパイラを使用していますか? – juanchopanza

+0

@元祖パンサVS2010 !! – niting112

3

あなたはライン

cout<"Destructor called for class A\n"; 

だけの意味A.

のデストラクタで<文字を忘れてしまいました文字列を返し、trueまたはfalseを返します。

あなたは

cout<<"Destructor called for class A\n"; 

を書く必要があり、それが正常に動作します。

< <オペレータの前と後にスペースを追加して、これをより明確にする方が良いです(私はいつもコードは呼吸が必要です(空気が必要です))。

2

あなたのコードを示しています。

裁判所未満< "クラスA \ nのためと呼ばれるデストラクタ"。

< <の2つが必要です。私はそれがすべてでコンパイル驚いている...

+0

<のうちの1つを離れることは、依然として有効なC++です。エラーはなく、VS2010での警告です。 – Trent

+0

は有効なC++にしません。私はそうではないと言っているわけではありません。 – juanchopanza

+0

ストリームのポインタ型への暗黙的な変換のため、有効なC++ 03です。まともなコンパイラは、未使用の計算について警告します。ストリームはポインタ型ではなく 'bool'に変換され、' bool'とポインタとを比較することは合法ではないので、C++ 11は無効です。 –

1
~A(){ 
     cout<"Destructor called for class A\n"; 
    } 

COUTで使用するオペレータが<<ない<その未満オペレータ でそれを修正し、あなたのコードは、罰金になります。

~A(){ 
     cout<<"Destructor called for class A\n"; 
    }