当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

C++编程杂谈之三:面向对象(续)[VC/C++编程]

赞助商链接



  本文“C++编程杂谈之三:面向对象(续)[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

上一篇我们触及了面向对象的一个基本概念--封装,封装是一个相对对比简单的概念,也很简单承受,但是很多的场所下面,仅仅是封装并不能很好的办理很多问题,考虑下面的例子:

假定我们需求计划一个对战游戏的战斗细节,在最初的版本中我们将支持一种行动--fight.假定我们有三种角色:fighter、knight和warrior,每种角色的health、hit point差别,基于封装的基本设法,我们很自然的想到对每个对象利用类的封装,首先明显的元素有2个:health、hit point,别的还有name(我们不能只有三个角色)和战斗的速度speed,办法有:hit、isalive.基于这样的设法,我们给出下面的类:

class fighter
{
  private:
    int        m_iHealth;
    int       m_iSpeed;//为了便利,这个值利用延时值,越大表示速度越慢
    const int     m_iHitPoint;
    char       m_strName[260];
  public:
    fighter(const char* strName);
    void hit(fighter* pfighter);
    bool isAlive();
};

上面的类可以清楚的抽象出我们所需求表达的数据范例之一,这里大概你已经发现了一些问题:

成员函数hit用来处理战斗事件,但是我们有差别的角色,fighter不大概只跟自己一样的对手作战,我们但愿它能和任何角色战斗,当然,利用模板函数可以简单的办理这个问题.别的,我们必须去实现三个差别的类,并且这些类必须都实现这些属性和办法.即便这些问题我们都办理了,目前我们要组织两个部队作战,我们但愿利用一种群体范例来描写它们,问题是我们必须针对每一种类成立呼应的群体构造,当然你可以认为3个差别的范例不是很多,完好可以对付,那么假若有一天系统进级,你需求管理上百种范例的时刻,会不会头大呢?

在C++中,担当便可以很好的办理这个问题,在C++中,担当表示的是一种IS-A关系,即派生类IS-A基类,很多实际世界中的关系可以这样来描写,如:dog is-a animal,dog是animal的派生(担当),担当产生的对象拥有父(基)对象的全部属性和行为,如animal的全部属性和行为在dog身上城市有呼应的表现.在UML的描写中,这种关系被称为泛化(generalization).普通情形下,当我们需求实现一系列类似(具有一定的共性)但是有彼此差别的类别的时刻,利用担当都是很好的办理办法,比方前面的代码固然也可以实现我们的目标,但是明显很难管理,下面给出利用担当后的实现:

class actor//基类
{
  protected:
    int        m_iHealth;
    const int     m_iSpeed;//为了便利,这个值利用延时值,越大表示速度越慢
    const int     m_iHitPoint;
    char       m_strName[260];
  public:
    actor(const char* strName,const int iHealth,const int iSpeed,const int iHitpoint);

    int& Health(){ return m_iHealth; };
    const char* getName(){ return m_strName; };
    virtual void hit(actor *Actor) = 0;
    bool isAlive();
}; 
actor::actor(const char* strName,const int iHealth,const int iSpeed,const int iHitpoint):
m_iHealth(iHealth),
m_iSpeed(iSpeed),
m_iHitPoint(iHitpoint)
{
  strcpy(m_strName,strName);
}
bool actor::isAlive()
{
  return (m_iHealth>0);
}
/////////////////////////////////////////////////////////
//类fighter
class fighter :public actor
{
  public:
    fighter(const char* strName);
    virtual void hit(actor *Actor);
  private:
};
fighter::fighter(const char* strName):
actor(strName,100,20,20)
{
}
void fighter::hit(actor *Actor)
{
  Sleep(m_iSpeed);
  if(!isAlive())
  {
    return ;
  }
  if(Actor&&Actor->isAlive())
  {
     //这里我们用一个函数做了左值,因为函数返回的是引用
    if(isAlive())
      Actor->Health() = Actor->Health() - m_iHitPoint;
  }
}
/////////////////////////////////////////////////////////
//类knight
class knight :public actor
{
  public:
    knight(const char* strName);
    virtual void hit(actor *Actor);
  private:
};
knight::knight(const char* strName):
actor(strName,150,20,25)
{
}
void knight::hit(actor *Actor)
{
  Sleep(m_iSpeed);
  if(!isAlive())
  {
    return ;
  }
  if(Actor&&Actor->isAlive())
  {
    if(isAlive())
      Actor->Health() = Actor->Health() - m_iHitPoint;
  }
}
/////////////////////////////////////////////////////////
//类warrior
class warrior :public actor
{
  public:
    warrior(const char* strName);
    virtual void hit(actor *Actor);
  private:
};
warrior::warrior(const char* strName):
actor(strName,150,20,25)
{
}
void warrior::hit(actor *Actor)
{
  Sleep(m_iSpeed);
  if(!isAlive())
  {
    return ;
  }
  if(Actor&&Actor->isAlive())
  {
    if(isAlive())
      Actor->Health() = Actor->Health() - m_iHitPoint;
  }
}


  以上是“C++编程杂谈之三:面向对象(续)[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>高质量C++/C编程指南-第7章-内存管理(6)</b>
  • 高质量C++/C编程指南-第7章-内存管理(7)
  • 高质量C++/C编程指南-第8章-C++函数的高级特点(1)
  • 高质量C++/C编程指南-第8章-C++函数的高级特点(2)
  • 高质量C++/C编程指南-第8章-C++函数的高级特点(3)
  • <b>高质量C++/C编程指南-第8章-C++函数的高级特点(4)</b>
  • <b>高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(1</b>
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(2
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(3
  • 高质量C++/C编程指南-第9章-类的构造函数、析构函数与赋值函数(4
  • <b>高质量C++/C编程指南-第10章-类的担当与组合(1)</b>
  • 高质量C++/C编程指南-第10章-类的担当与组合(2)
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .