2015-10-30 3 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

Когда деструктор ('~ Устройство') вызывается,' _battery' является 'NULL', вам нужно« удалить »батарею, когда вы ее отключите или извне –

+3

use std :: unique_ptr –

+0

вы используете C++, почему вы не используете std :: shared_ptr или std :: unique_ptr, как он подходит? – Nandu

ответ

0

disconnectBattery называют первым, который обнуляет указатель к батарее. Затем, когда вы delete drill, деструктор вызывается, но указатель имеет значение null, поэтому команда delete ничего не делает.

Вопрос, с которым вы имеете дело, является собственностью. Какая часть кода «владеет» аккумулятором? Если это упражнение, сверло должно удалять батарею, когда она выполняется с ней (во время разъединения, прежде чем обнулить указатель). Если какой-либо другой кусок кода владеет батареей, тогда сверло никогда не должно удалять батарею. Вам нужно принять решение об этом, чтобы вы могли последовательно реализовать право собственности.