Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;类继承顺序_C++_Class_Inheritance - Fatal编程技术网

C++ C++;类继承顺序

C++ C++;类继承顺序,c++,class,inheritance,C++,Class,Inheritance,这与其他问题类似,我确信,我已经通读了。我正在尝试写一个move类。我需要一个玩家类和一个继承移动类的物品类,反之亦然。这就是我遇到的困难。我不能头脑清醒,也不能去工作,这样基层就不会“动”。我在这里迷路了 class Player { protected: int x; int y; int str; int speed; int level; int exp; public: Player(int _str, int _speed,

这与其他问题类似,我确信,我已经通读了。我正在尝试写一个move类。我需要一个玩家类和一个继承移动类的物品类,反之亦然。这就是我遇到的困难。我不能头脑清醒,也不能去工作,这样基层就不会“动”。我在这里迷路了

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(?),这听起来根本不对…

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

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

我的设计如下:

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;
}
首先,公共继承意味着关系。所以
Move
IS-A
Player
没有任何意义。你的设计是错误的

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

我的设计如下:

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;
}

我建议大家考虑一下,
是一个
有一个
习惯用法。所以这名球员是一个动作吗?可能不是,这是一个球员的举动吗?也可能不是。然后让我们尝试一下
有一个
。这一步是有一个玩家还是玩家有一个动作?我要说的是,这名球员有个人的举动。这意味着不使用继承,而是让播放器包含
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
}

有其他方法可以做到这一点,但这种方法很简单。如果你打算用继承来解决你的问题,我会让
Player
Move
继承,但我仍然坚持我最初的答案,我只是想帮助你进一步解释。

我建议你这样想:
是一个
有一个
习惯用法。所以这名球员是一个动作吗?可能不是,这是一个球员的举动吗?也可能不是。然后让我们尝试一下
有一个
。这一步是有一个玩家还是玩家有一个动作?我要说的是,这名球员有个人的举动。这意味着不使用继承,而是让播放器包含
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
}

有其他方法可以做到这一点,但这种方法很简单。如果你打算用继承来解决你的问题,我会让
Player
Move
继承,但我仍然坚持我最初的答案,我只是想进一步解释一下。

首先,这似乎更适合你。第二,在回答你的问题之前,了解这些课程的目的是有帮助的。首先,这似乎更适合你。第二,在回答你的问题之前了解这些课程的目的会很有帮助。谢谢。我想做的是让“玩家”定义关于玩家的一切,“物品”类基本上是相同的。player和item类都有受保护的变量x、y、width和height。move类的所有成员函数都可以更改x和y值。我正在/曾经计划能够将“玩家”声明为正常,与“物品”相同,并且能够使用“移动”中的函数移动。@EvanCarslake派生
Player
from
move
then?@Appleshell,这就是我的想法,但是通过move类调用所有玩家属性似乎很奇怪。@EvanCarslake如果你愿意,你可以使用它。用x和y创建一个
Positionable
Movable
从Positionable派生,而
Player
最终从Movable派生。@EvanCarslake,我的设计是将
Movable
声明为接口,并从
Movable
继承(实际实现)
Player
。但你做的恰恰相反。但如果将
Movable
重命名为
MovablePlayer
,则当前的设计将更加精确。然后你可以说
MovablePlayer
Player
的一个特长,它可以移动。这是有道理的,因为并非所有玩家都能移动*。检查编辑的ReplyTanks。我想做的是让“玩家”定义关于玩家的一切,“物品”类基本上是相同的。player和item类都有受保护的变量x、y、width和height。move类的所有成员函数都可以更改x和y值。我正在/曾经计划能够将“玩家”声明为正常,与“物品”相同,并且能够使用功能移动