C++ C++;类继承顺序
这与其他问题类似,我确信,我已经通读了。我正在尝试写一个move类。我需要一个玩家类和一个继承移动类的物品类,反之亦然。这就是我遇到的困难。我不能头脑清醒,也不能去工作,这样基层就不会“动”。我在这里迷路了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,
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-APlayer
没有任何意义。你的设计是错误的
关于你的错误,这太愚蠢了。您正在创建一个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-APlayer
没有任何意义。你的设计是错误的
关于你的错误,这太愚蠢了。您正在创建一个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
frommove
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值。我正在/曾经计划能够将“玩家”声明为正常,与“物品”相同,并且能够使用功能移动