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의 멤버 중 하나인데도 왜 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*. 할 수있는 이상한 일입니다. 하지만, 슬프게도, <<-<을 변경하고 작동합니다 :

+0

감사합니다 !! 부주의 한 실수로 미안합니다. 그러나 왜 컴파일러가 오류를 던지지 않았는지 궁금해! – niting112

+0

@ niting112 궁금한데, 어떤 컴파일러를 사용하고 있습니까? – juanchopanza

+0

@ juanchopanza VS2010 !! – niting112

3

http://ideone.com/8TDyy 당신은 A의 소멸자에 < 문자를 잊어

라인

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

그냥 의미 : 주어진과 cout을 비교 문자열을 반환하고 true 또는 false를 반환합니다.

당신은

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

를 작성해야 그리고 그것을 올바르게 작동합니다.

< < 연산자의 전후에 공백을 추가하여 더 명확하게 만드는 것이 더 좋습니다 (나는 항상 코드가 숨을 쉬어야한다고 요구합니다).

2

코드는 보여줍니다

cout을 < "A 급 \ n을 요구 소멸자";

두 개의 < <이 있어야합니다. 나는

+0

분명히 <중 하나를 벗어나는 것은 여전히 ​​유효한 C++입니다. VS2010에서는 오류가 발생하지 않고 경고 만 표시됩니다. – Trent

+0

은 C++을 유효하게하지 않습니다. 나는 그것이 아니라고 말하는 것이 아닙니다 ... – juanchopanza

+0

스트림을 포인터 유형으로 암시 적으로 변환하기 때문에 유효한 C++ 03입니다. 알맞은 컴파일러는 사용하지 않은 계산에 대해 경고합니다. 그것은 스트림이 이제는 포인터 타입이 아닌'bool'으로 변환되고'bool'을 포인터와 비교하는 것이 합법적이지 않기 때문에 C++ 11은 유효하지 않습니다. –

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

cout과 함께 사용하는 운영자는 운영자 보다 적은 올바른 IT와 코드가 잘 될 것입니다 <<하지 <입니다 ... 전혀 컴파일 놀랐어요.

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