• 内部类创建一个内部版本


           C++常要考虑这样一样问题:指针的初始化,对象何时创建,何时释放。这无疑给程序猿加重了负担,程序猿不仅要考虑业务逻辑,还要时时刻刻刻指针在何时创建和释放。

    那有没有什么办法能够解决问题呢?答案是肯定的。以下就通过一个样例来解说这样的模式。
           如果如今要仿真模拟一艘航空母舰。

    广义的航空母舰是指“航空母舰战斗群”,如果一支航空母舰战斗群(AVSG)由1艘航母(AircraftCarrier)。1艘补给舰 (DepotShip),2艘防空导弹驱赶舰(Destroyer)。4艘多功能护卫舰(Frigate),2艘093核潜艇(NuclearSubmarine)组成,若干舰载机(ShipboardAircraft)和预警机组成。

    如今用简单的类来模拟这些战机。


          如果有这样一个航空母舰类和一个舰载机类例如以下:

    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艘舰载机(ShipboardAircraft)。那么我们就能够把航母和舰载机的创建与销毁交由航空母舰战斗群负责。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和ShipboardAircraft两个类的构造函数和析构函数都定义成protected。且都定义AVSG为友元类,这样是从客观上保证了AircraftCarrier和ShipboardAircraft的对象不能在外面被创建和释放。仅仅能由AVSG内部来创建和释放,而AircraftCarrier和ShipboardAircraft的调用者不用考虑对象何时创建和释放。

    版权声明:本文博客原创文章。博主可能不无任何商业用途的同意才能使用。转载请注明出处。

  • 相关阅读:
    Java异常处理中,try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
    是否可以继承String类
    启动一个线程是用run()还是start()?
    关键字final 分别修饰一个类,一个方法,一个变量,各起什么作用
    Switch选择语句能否作用在String【字符串】上,也就是能否这么写:Switch(一个字符串变量)?
    char类型能否存储一个中文字符?为什么
    在java中,List是个接口,那实现List接口的类有哪些,有什么区别?
    请写出一个单例模式。
    数组有没有length()这个方法?String有没有length()这个方法?
    请写出5种常见到的runtime exception。
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4741281.html
Copyright © 2020-2023  润新知