如何删除在C ++中附加另一个对象的对象?

时间:2015-10-30 16:30:32

标签: c++ unit-testing destructor delete-operator

我正在进行这种单元测试。我想删除钻头和电池,但它似乎不起作用(可能不能删除电池)。我可以在析构函数上做任何事情来处理这个问题吗?

 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;
}

1 个答案:

答案 0 :(得分:0)

首先调用

disconnectBattery,它将指向电池的指针归零。然后当你delete drill时,析构函数被调用但是指针为空,所以delete命令什么都不做。

您正在处理的问题是所有权问题。什么代码"拥有"电池?如果它是钻头,那么钻头应该在完成时取消电池(在断开连接期间,在使指针归零之前)。如果其他一些代码拥有电池,则钻头不应该删除电池。您需要对此做出决定,以便您可以始终如一地实施所有权。