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, называется. Почему A destructor не вызывается, хотя объект obj является одним из членов B?деструктор вызов

+0

@Nawaz Спасибо за ответ. Это оригинальный код. Деструктор А не называется. – niting112

+0

Деструктор A определенно называется. Ваш код как есть не компилируется, см. ~ A(). – juanchopanza

+0

@juanchopanza Да, это называется. Но VS2010 не выбрал ошибку для использования одиночного '<'. – niting112

ответ

5

Вы не нашли < в деструкторе элементов а:

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

Если вы не получаете ошибку компиляции для выражения:

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

хорошо, компилятор пытается сравнить cout до const char*. Что странно. Но, увы, изменить < к << и он должен работать: http://ideone.com/8TDyy

+0

Спасибо !!. Извините за неосторожную ошибку. Но интересно, почему компилятор не выбросил ошибку! – niting112

+0

@ niting112 Мне любопытно, какой компилятор вы используете? – juanchopanza

+0

@juanchopanza VS2010 !! – niting112

3

Вы забыли < характер в деструктор А.

Линия

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

просто означает: сравнить соиЬ с данным string и возвращает true или false.

Вы должны написать

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

А затем он работает правильно.

Лучше добавить пространства до и после оператора < <, чтобы сделать это понятным (я всегда говорю, что код должен дышать (ему нужен воздух)).

2

Ваш код показывает:

< соиЬ "Destructor призвал к классу А \ п";

Должно быть два < <, не один. Я удивлен, что он компилируется на всех ...

+0

Ну, очевидно, оставляя один из Trent

+0

, что не делает его действительным C++. Я не говорю, что это не так ... – juanchopanza

+0

Это действительно C++ 03 из-за неявного преобразования потока в тип указателя. Хороший компилятор будет предупреждать о неиспользованном расчете. Это недопустимый C++ 11, потому что потоки, которые теперь конвертируются в 'bool', а не тип указателя, и сравнение« bool »с указателем не являются законными. –

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

оператор для использования с соиЬ является << и не < его меньше, чем оператор правильно это и ваш код будет хорошо.

~A(){ 
     cout<<"Destructor called for class A\n"; 
    } 
Смежные вопросы