繁体   English   中英

C ++类继承顺序

[英]C++ Class Inheritance Order

我仔细阅读过,这与我确定的其他问题类似。 我正在尝试编写一个移动类。 我需要一个Player类和一个继承move类的Item类,反之亦然。 这就是我遇到的困难。 我不能四处走动,也无法上班,否则基类就不会“移动”。 我在这里迷路了...

class Player {

protected:
    int x;
    int y;
    int str;
    int speed;
    int level;
    int exp;

public:
    Player(int _str, int _speed, int _level, int _exp) { x=0;y=0;str=_str;speed=_speed;level=_level;exp=_exp; }
    int GetX() {return x;}
    int GetY() {return y;}
    int GetStr() {return str;}
    int GetSpeed() {return speed;}
    int GetLevel() {return level;}
    int GetExp() {return exp;}

};


class Move : public Player {
public:
    void TryMove(int n) { x += n; }
};


int main(int argc, char *argv[])
{
Player You(101, 5, 3, 43625);


//You.TryMove(5); how?


}

TryMove(5)失败。 如果我用另一种方式做,那么他们输入的是Move(?),这听起来根本不正确...

首先, 公共继承意味着IS-A关系。 因此, Move IS-A Player没有任何意义。 您的设计是错误的。

关于您的错误,这只是愚蠢的。 您正在创建一个Player对象You并在其上调用Move方法。 要使用Move类的方法,您必须创建Move对象(或任何公共派生类)。

class Move : public Player {
  public:
   //either create a ctor that will pass params to parent ctor, or create an empty ctro in parent class
   Move(int _str, int _speed, int _level, int _exp):Player(_str,_speed,_level,_exp){} 
   void TryMove(int n) { x += n; }
};


int main(int argc, char *argv[]){

  Move You(101, 5, 3, 43625);
  You.TryMove(5); 
}

我将其设计如下:

class Movable{
    public:
     virtual bool TryMove()=0;
};

class Player: public Movable {
 public:
  bool TryMove() override{
    //implementation code
  }

 //other members
};

 int main(){
  Movable*  player = new Player(101, 5, 3, 43625);
  player->TryMove();
  delete player;
}

我建议考虑的方式是“成语Is A或“ Has A成语”。 所以...玩家在移动吗? 可能不是,此举是球员吗? 也可能不是。 然后让我们尝试Has A 这个举动有球员还是球员有举动? 我要说的是玩家个人有移动。 这意味着不使用继承,而是让播放器包含Move类的实例。 所以...

class Player{
public:
    Move myMove;//where move is defined already as whatever you need it to be.    
};

//then your main
int main(int argc, const char** argv){
    //...other setup here
    Player p;
    p.myMove.TryMove(10);
    //whatever else...
}

这就是我可能如何处理您的设计。 就错误而言...在上面的代码中,您从Player继承了Move继承,但是您创建了一个Player并希望它具有Move的功能,但是基于您在其中设置的继承,它无法拥有该功能。示例代码。

让我知道您是否需要澄清我所说的内容或其他内容。 祝好运

编辑:

根据您的评论,我建议您使用一个包装函数,该函数将获取所需的值。

class Player{
public:
    void TryMove(int i);
private:
    Move myMove;
    int x;//the value you will be getting from Move::tryMove
};

void Player::TryMove(int i){
    this->x = myMove.tryMove(i);//store the value of the function call
    //the function obviously won't be a void function in this case
}

您还有其他方法可以执行此操作,但是这种方法很简单。 如果您打算使用继承来解决您的问题,我将让PlayerMove继承,但是我仍然支持我最初的回答,我只是想帮助进一步解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM