[英]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
}
您还有其他方法可以执行此操作,但是这种方法很简单。 如果您打算使用继承来解决您的问题,我将让Player
从Move
继承,但是我仍然支持我最初的回答,我只是想帮助进一步解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.