当前位置: 首页 > news >正文

内部类创建一个内部版本

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

那有没有什么办法能够解决问题呢?答案是肯定的。以下就通过一个样例来解说这样的模式。


       如果如今要仿真模拟一艘航空母舰。

广义的航空母舰是指“

航空母舰战斗群”,如果一支航空母舰战斗群(AVSG)由1艘航母( AircraftCarrier )。1艘补给舰 (D epotShip) ,2艘防空导弹驱赶舰(Destroyer)。4艘多功能护卫舰(F rigate ),2艘093核潜艇(N uclearSubmarine )组成,若干舰载机(S hipboardAircraft )和预警机组成。

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


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

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两个类的构造函数和析构函数都定义成protected。且都定义AVSG为友元类,这样是从客观上保证了AircraftCarrier和 S hipboardAircraft的对象不能在外面被创建和释放。仅仅能由AVSG内部来创建和释放,而AircraftCarrier和 S hipboardAircraft的调用者不用考虑对象何时创建和释放。

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

相关文章:

  • 移动端开发问题整理
  • 开学第一周
  • 【零基础学习iOS开发】【02-C语言】03-关键字、标识符、注释
  • 9 处理文本的工具sed
  • iOS App 研发的最后冲刺:内测与部署
  • 遍历map集合的三种方式
  • 以太坊的存储税
  • 解决EditorLineEnds.ttr被锁定导致Delphi2006-2010无法启动的问题
  • 6.Swift学习之逻辑分支
  • Linux基础知识--3.Linux目录和文件相关命令和Linux基础特性2
  • 【实操】如何安装及查看云监控
  • week 7 文件操作与模板
  • WPS Office 2019企业版全面升级,推出密级关键词和移动会议新功能
  • linux简单命令的使用
  • js函数的递归调用方法
  • [笔记] php常见简单功能及函数
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 【React系列】如何构建React应用程序
  • 【刷算法】求1+2+3+...+n
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Angular6错误 Service: No provider for Renderer2
  • Java新版本的开发已正式进入轨道,版本号18.3
  • LeetCode29.两数相除 JavaScript
  • linux学习笔记
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • PAT A1017 优先队列
  • REST架构的思考
  • Sass 快速入门教程
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 给第三方使用接口的 URL 签名实现
  • 解决iview多表头动态更改列元素发生的错误
  • 前端工程化(Gulp、Webpack)-webpack
  • 如何使用 JavaScript 解析 URL
  • 我与Jetbrains的这些年
  • 系统认识JavaScript正则表达式
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • Python 之网络式编程
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • (2)Java 简介
  • (31)对象的克隆
  • (C++20) consteval立即函数
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (转)ORM
  • (转)四层和七层负载均衡的区别
  • .net 4.0发布后不能正常显示图片问题
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .net生成的类,跨工程调用显示注释
  • .net项目IIS、VS 附加进程调试
  • .skip() 和 .only() 的使用
  • .vue文件怎么使用_vue调试工具vue-devtools的安装