2015-10-30 90 views
0

我正在進行這個單元測試。我想刪除鑽頭和電池,但似乎不起作用(也許電池不能被刪除)。我可以在析構函數上做任何事情來處理這個問題嗎?如何刪除C++中連接另一個對象的對象?

void test_rover::testDisconnectBattery() { 
     Drill* drill = new Drill(); 
     drill->connectBattery(new Battery(10)); 
     drill->disconnectBattery(); 

     //CPPUNIT_ASSERT(drill->Connected()==false); 
     delete drill; 
     CPPUNIT_ASSERT(Object::getCount()==0); 
    } 

Device.cpp(設備是鑽基部)

Device::Device() { 
    } 

    Device::Device(const Device& copy) { 
    } 

    Device::~Device() { 
     delete _battery; 
    } 

    void Device::connectBattery(Battery *b){ 
     _battery = b; 
    } 

    void Device::disconnectBattery(){ 
     _battery = NULL; 
    } 

Battery.cpp

Battery::Battery(int power) { 
    _power = power; 
} 

Battery::Battery(const Battery& copy) { 
} 

Battery::~Battery() { 
} 

int Battery::Power(){ 
    return _power; 
} 
+0

當析構函數('〜Device')被調用,'_battery'爲'NULL'時,您需要在斷開連接或外部連接時刪除電池 –

+3

使用std :: unique_ptr –

+0

您正在使用C++,爲什麼你不使用std :: shared_ptr或std :: unique_ptr,因爲它適合? – Nandu

回答

0

disconnectBattery首先被調用,其空值出指針到電池。然後,當delete drill時,析構函數被調用,但指針爲空,因此delete命令不執行任何操作。

您正在處理的問題是所有權問題之一。什麼代碼「擁有」電池?如果是鑽,那麼鑽完成後應該刪除電池(在斷開連接過程中,在清空指針之前)。如果其他代碼擁有電池,則鑽機不應該刪除電池。您需要對此做出決定,以便始終如一地執行所有權。

相關問題