2016-04-05 47 views
1

Yani bu Car.hNeden C++ özel yuvalanmış sınıf için destructor çağrılmaz?

i var Car.cpp yılında
#pragma once 

#include<iostream> 
#include<string> 
using namespace std; 

class Car 
{ 

private: 
    int speed; 
    class GearBox; 
    GearBox& gearBox; 

public: 
    Car(); 
    ~Car(); 
}; 

class Car::GearBox { 
private: 
    int gear; 

public: 
    GearBox(); 
    ~GearBox(); 
}; 

#include"Car.h" 


    Car::Car(): speed(0), gearBox(GearBox()) 
{ 
    cout << "Car constructor" << endl; 

} 


Car::~Car() 
{ 
    cout << "Car destructor" << endl; 
} 

Car::GearBox::GearBox(): gear(0) 
{ 
    cout << "Gearbox constructor" << endl; 
} 

Car::GearBox::~GearBox() 
{ 
    cout << "GearBox destructor" << endl; 
} 

benim kodudur ve benim ana geçerli: Programın

#include"Car.h" 


int main() { 

    { 
     cout << "Starting program!" << endl; 

     Car car; 

    } 

    system("PAUSE"); 
    return 0; 
} 

Sonucu geçerli: Başlangıç ​​programı! GearBox yapıcısı Araç yapıcı Araç yıkıcı

Neden Şanzıman yıkıcı çıktısı yapılmaz? (otomobili var iken şanzımanın bulunması gerektiğinden dolayı o şanzıman için bir referans var demektir)

+3

MSVS kullanıyor musunuz? Eğer notu ise bir lvalue referansa geçici bağlayıcı olarak 'şanzıman (GearBox())' yasadışı olduğunu. – NathanOliver

+0

Bu kod geçerli değil C++. Lvalue referansları, rvalues'e bağlanmaz. –

+0

@NathanOliver evet MSVS kullanıyorum. Tamam o zaman neden program başarıyla derlendi? Ve bunu nasıl doğru yapabilirim? – Bunc

cevap

-2

GearBox başlatıldı mı?

Car::Car(): speed(0), gearBox(GearBox()) 
{ 
    cout << "Car constructor" << endl; 
} 

Car::Car(): speed(0)
{
static GearBox inst;
vites kutusu = inst;
cout << "Car constructor" << endl;
}

DÜZENLEME:

class Car 
{ 
private: 
    int speed; 
    class GearBox { // referable 
    private: 
     int gear; 
    public: 
     GearBox() : gear(0) { 
      cout << "Gearbox constructor" << endl; 
     } 
     ~GearBox() { 
      cout << "GearBox destructor" << endl; 
     } 
    }; 
    GearBox* gearBox; 

public: 
    Car(); 
    ~Car(); 
}; 

Car::Car(): speed(0) 
{ 
    static GearBox inst; 
    gearBox = &inst; 
    cout << "Car constructor" << endl; 
} 
+0

Bu nedir ... Bu geriye doğru bir adım ... ne yapıyorsunuz? –

+0

Derlenebilse de, çalışma kodunun anlamı nedir? : D – nariuji

0

Bu durum potansiyel olarak ilk etapta referans başlatılması (a, ki bu sağlar olması ile ilgili bir derleyici böcek, olması gerekir Visual Studio uzantısı, gerçek, standartlaştırılmış, C++ dilinin herhangi bir sürümüyle uyumlu değildir. Kurucular ve yıkıcı

Reproduction screenshot

C++ derleyicileri onlar böyle çıktı içerse bile kopyalama işlemi elide izin verilir, ancak:

Ben derleyici VS bir online kullanarak bu üretebilir inanıyoruz.

+0

Evet, eminim! – Bunc

+0

@bunc: Evet, o zaman sorun yok. MS Connect'te yayınlamayı deneyin –

+0

Bellek sızıntısı için sorumlu kişi derleyici değil geliştirici. – nariuji