内部类创建一个内部版本

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的调用者不用考虑对象何时创建和释放。

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

时间: 2024-10-11 08:58:16

内部类创建一个内部版本的相关文章

11_Eclipse中演示Git版本的创建,历史版本的修改,创建分支,合并历史版本和当前版本

?? 1 执行以下案例: 某研发团队2011年初开发了一款名为Apollo的信息系统,目前已发布v1.0版本.此项目初期已有部分基础代码, 研发团队再此基础代码上经过3个月的努力发布了一个功能相对完备的Apollo 1.0版本进行销售. 由于销售业绩良好,因此研发团队正在着手v2.0版本的开发工作. 但就在这个时候,有客户发现v1.0软件系统一严重bug,如不及时修复将造成严重后果. 研发团队收到bug报告后立刻安排部分研发人员对v1.0版本进行修复,但其他研发人员则继续开发v2.0版本的新功能

创建一个简单的银行程序包.........未完善,待续

2练习1:创建一个简单的银行程序包   练习目标-Java 语言中面向对象的封装性及构造器的使用. 任务 在这个练习里,创建一个简单版本的(账户类)Account类.将这个源文件放入banking程序包中.在创建单个帐户的默认程序包中,已编写了一个测试程序TestBanking.这个测试程序初始化帐户余额,并可执行几种简单的事物处理.最后,该测试程序显示该帐户的最终余额. 1. 创建banking 包 2. 在banking 包下创建Account类.该类必须实现上述UML框图中的模型. 声明一

创建一个简单的银行程序包

创建一个简单的银行程序包   练习目标-Java 语言中面向对象的封装性及构造器的使用. 任务 在这个练习里,创建一个简单版本的(账户类)Account类.将这个源文件放入banking程序包中.在创建单个帐户的默认程序包中,已编写了一个测试程序TestBanking.这个测试程序初始化帐户余额,并可执行几种简单的事物处理.最后,该测试程序显示该帐户的最终余额. 1. 创建banking 包 2. 在banking 包下创建Account类.该类必须实现上述UML框图中的模型. 声明一个私有对象

BASH 创建一个命令 f1 使之可以简单管理文件版本

创建命令f1 创建一个shell脚本 f1,放到 $PATH 可以找到的位置: f1用法 1. 创建一个文件 foo.txt,并 backup 它 $ cat foo.txt 1 $ f1 backup foo.txt 2. 修改它 $ cat foo.txt 2 3. 还原到上一个版本 $ f1 rollback foo.txt $ cat foo.txt 1 BASH 创建一个命令 f1 使之可以简单管理文件版本,布布扣,bubuko.com

django学习笔记【001】django版本的确定&amp;创建一个django工程

2.3 查看当前的django版本 python3.5 -m django --version 1.10.4 2.3.1 创建一个django工程 django-admin startproject mysite 在创建工程时的一些注意项: 1.程序中所以的命名力求见名知义,这个工程明也一样 2.注意这个工程不要和python中其它的东西重名:如test,django 这个的命名对于工程来说是不合适的. 所谓的django工程(project)只不过是一个在当前目录下的一个子目录,里面包涵了若干

xcode创建一个工程的多个taget,便于测试和发布多个版本

背景:很多时候,我们需要在一个工程中创立多个target,也就是说我们希望同一份代码可以创建两个应用,放到模拟器或者真机上,或者是,我们平时有N多人合作开发,当测试的时候,在A这里装了一遍测A写的那块,当需要测试B写的代码时,我们需要到B那里去装一遍,如果只有一个target的话,那么A的将会被覆盖 还有些时候,我们需要确定到底是A的问题还是B的代码出了问题,这时候都需要建立一个工程能够编译多个版本出来,下文就介绍怎么在一个工程中编译多个版本 好了,闲话不多少,下面正式开始: 我们建立一个默认的

《转》xcode创建一个工程的多个taget,便于测试和发布多个版本

背景:很多时候,我们需要在一个工程中创立多个target,也就是说我们希望同一份代码可以创建两个应用,放到模拟器或者真机上,或者是,我们平时有N多人合作开发,当测试的时候,在A这里装了一遍测A写的那块,当需要测试B写的代码时,我们需要到B那里去装一遍,如果只有一个target的话,那么A的将会被覆盖 还有些时候,我们需要确定到底是A的问题还是B的代码出了问题,这时候都需要建立一个工程能够编译多个版本出来,下文就介绍怎么在一个工程中编译多个版本 好了,闲话不多少,下面正式开始: 我们建立一个默认的

创建一个版本库,把文件夹用Git管理起来

创建一个文件夹,把这个文件夹用Git管理起来,那么这个文件夹的改变都可以被Git跟踪到,当然也可以将Git中的文件还原到某一个时刻. 首先创建一个空的目录,然后将空的目录由Git来管理 1.建立一个文件夹: 2.在MINGW中进入文件夹 3.将这个文件夹由Git来管理 首先使用命令符pwd来确认当前所在的目录 确认完毕后将文件夹有Git来管理使用命令符git init   同时他告诉你这是一个空的文件夹 4.把文件添加到版本库中 首先必须明确一点所有的版本控制系统都只能跟踪文本文件的改动,比如t

使用ABP创建一个《电话簿项目》-MPA版本

此篇博客是属于半教程博客,为什么说是半教程呢.因为我不会打算说什么理论性的东西,没必要.要看理论性的资料以及基础信息,请前往tkb至简和@阳光铭睿的博客查看文档资料. 扫个小盲: MPA:为多页面,通过服务器端进行渲染razor进行绑定数据的方式(等其他情况. SPA:则为单页面,可以用作前后端分离如:vue,angular这些前端技术,而后端只需要提供webapi就可以了(当然还有其他方式. 1.首先创建一个模板解决方案"PhoneBook" 打开ABP的官方网站:http://ww