クラスの内部解放の作成

4500 ワード

C++は、オブジェクトポインタを使用するときに、ポインタの初期化、オブジェクトの作成、解放を常に考慮します.これは間違いなくプログラマーに負担をかけ、プログラマーはビジネスロジックだけでなく、ポインタがいつ作成され、解放されるかを常に考慮しなければならない.では、この問題を解決する方法はありますか?答えは肯定的で、次は一つの例を通じてこのパターンを説明します.
空母をシミュレートすると仮定します.広義の空母は「
航空母艦戦闘群」は、1本の航空母艦戦闘群(AVSG)が1隻の空母(
AircraftCarrier
)、補給艦1隻(D
epotShip)
、2隻の防空ミサイル駆逐艦(Destroyer)、4隻の多機能護衛艦(F
rigate
)、093原子力潜水艦2隻(N
uclearSubmarine
)構成、若干の艦載機(S
hipboardAircraft
)と警報機で構成されています.今では簡単なクラスでこれらの戦闘機をシミュレートします.
こんなものがあるとしたら
航空母艦類と1つの艦載機類は以下の通りである.
AircraftCarrier
/*     
 * File:   AircraftCarrier.h
 * Author: luowf
 *
 * Created on July 31, 2014, 8:03 PM
 */

#ifndef AIRCRAFTCARRIER_H
#define	AIRCRAFTCARRIER_H

#include "stdafx.h"


class AircraftCarrier {
protected:
    AircraftCarrier();
    AircraftCarrier(const AircraftCarrier& orig);
    virtual ~AircraftCarrier();
    
public:
    void SetName(const string& name)
    {
        m_name = name;
    }
    
    string GetName()
    {
        return m_name;
    }
    
private:
    string m_name;
    
    friend class CVSG;
};

#endif	/* AIRCRAFTCARRIER_H */

ShipboardAircraft
/*    
 * File:   ShipboardAircraft.h
 * Author: luowf
 *
 * Created on August 1, 2014, 9:26 AM
 */

#ifndef SHIPBOARDAIRCRAFT_H
#define	SHIPBOARDAIRCRAFT_H

#include "stdafx.h"

class ShipboardAircraft {
protected:
    ShipboardAircraft();
    ShipboardAircraft(const ShipboardAircraft& orig);
    virtual ~ShipboardAircraft();
    
public:
    void SetName(const string& name)
    {
        m_name = name;
    }
    
    string GetName()
    {
        return m_name;
    }
    
private:
    string m_name;
    
    friend class CVSG;
};

#endif	/* SHIPBOARDAIRCRAFT_H */

空母戦闘群(AVSG)には空母(
AircraftCarrier
)とn隻の艦載機(
S
hipboardAircraft
)では、空母と艦載機の創建と廃棄を航空母艦戦闘群に任せることができます.AVSGのクラスは以下の通りである.
CVSG.h
/*        
 * 
 * File:   CVSG.h
 * Author: luoweifu
 *
 * Created on July 31, 2014, 7:49 PM
 */

#ifndef CVSG_H
#define	CVSG_H

#include "stdafx.h"
#include <string>

using namespace std;

class AircraftCarrier;
class ShipboardAircraft;

class CVSG {
protected:
    CVSG();
    CVSG(const CVSG& orig);
    virtual ~CVSG();
public:
    //    
    AircraftCarrier* CreateAircraftCarrier();
    //     
    ShipboardAircraft* AddShipboardAircraft();
    void SetName(const string& name);
    string GetName();
private:
    typedef vector<ShipboardAircraft*>  ShipAircVec;
    ShipAircVec            m_vecShipboardAircraft;
    AircraftCarrier*      m_pAircraftCarrier;
    string                m_name;
};

#endif	/* CVSG_H */

CVSG.cpp
/*        
 * 
 * File:   CVSG.cpp
 * Author: luoweifu
 * 
 * Created on July 31, 2014, 7:49 PM
 */

//==================================================

#include "CVSG.h"
#include "AircraftCarrier.h"
#include "ShipboardAircraft.h"

//==================================================

CVSG::CVSG() : m_pAircraftCarrier(NULL), m_name("") {
    m_vecShipboardAircraft.empty();
}

CVSG::CVSG(const CVSG& orig) {
}

CVSG::~CVSG() {
    if(m_pAircraftCarrier != NULL)
    {
        delete m_pAircraftCarrier;
        m_pAircraftCarrier = NULL;
    }
    for(ShipAircVec::iterator itr = m_vecShipboardAircraft.begin(); itr != m_vecShipboardAircraft.end(); itr ++)
    {
        if(*itr != NULL)
        {
            delete *itr;
            *itr = NULL;
        }
    }
    m_vecShipboardAircraft.clear();
}

AircraftCarrier* CVSG::CreateAircraftCarrier() {
    if(m_pAircraftCarrier == NULL)
    {
        m_pAircraftCarrier = new AircraftCarrier();
    }
    return m_pAircraftCarrier;
}

ShipboardAircraft* CVSG::AddShipboardAircraft() {
    ShipboardAircraft* pShipboardAircraft = new ShipboardAircraft();
    if(pShipboardAircraft != NULL)
    {
        m_vecShipboardAircraft.push_back(pShipboardAircraft);
    }
    return pShipboardAircraft;
}

void CVSG::SetName(const string& name)
{
    m_name = name;
}

string CVSG::GetName()
{
    return m_name;
}

説明:
AircraftCarrierと
S
hipboardAircraftの2つのクラスの構造関数と構造関数はprotectedとして定義され、AVSGは友元クラスとして定義されている.これは客観的にAircraftCarrierと
S
hipboardAircraftのオブジェクトは外部で作成および解放されず、AVSG内部でのみ作成および解放されますが、AircraftCarrierおよび
S
hipboardAircraftの呼び出し元は、オブジェクトがいつ作成され、解放されるかを考慮する必要はありません.