我必须为大学编写程序,但是在使用对象作为“班级玩家{}”的属性时遇到了麻烦。我必须使用的对象继承自父对象,并且具有一个兄弟对象:“ gun:machinegun”和“ gun:pistol”。
我了解合成的基础知识,但我不知道如何实现。
例如:
class player {protected: gun p; };
class gun {protected: int amunition;};
class pistol : public gun {};
然后,当我创建玩家时,每个玩家都应该拥有一支枪支;但我不知道该怎么做。
我无法在Internet上找到信息,因为这些示例未使用子类作为属性。我认为解决方案是将“如果”与新机枪或新手枪混合使用,但我不确定。
我还尝试在参数中使用指针而不是实例化对象,然后在if中分配一个新值;但是它没有编译,但是可能是因为还有另一个错误。如果有人可以给我一些建议,他将为我省去调试的麻烦。
谢谢。
答案 0 :(得分:1)
枪不一定是玩家的属性。拥有枪支的能力(至少就您的模型而言)是玩家的能力,并且与枪支的类型无关。
使用指针在正确的轨道上,但是显然做错了什么。没有代码,没有人可以建议您做错了什么。
我将代表使用指针拥有枪支并将gun
设置为多态基地的能力。这允许player
引用任何类型的gun
。还需要提供一些操作,以允许player
获得gun
的所有权。
class gun
{
public:
gun(int a = 0) : ammunition(a) {};
virtual void fire() {--ammunition;};
private:
int ammunition;
};
class pistol : public gun
{
public:
pistol(int a = 0) : gun(a) {};
virtual void fire() {gun::fire(); gun::fire();}; // fire two rounds from a pistol
};
class player
{
public:
player(gun *g = NULL) : p (g) {};
void addGun(gun *g) { p = g;};
void shoot() {p->fire();};
private:
gun *p;
};
int main()
{
pistol pistol(100);
player gun_nut;
gun_nut.addGun(&pistol);;
gun_nut.shoot();
}
以上内容是静态的,并且当main()
返回时,所有对象都将不复存在。如果要在程序中动态创建枪支和玩家,请考虑使用智能指针(例如std::unique_ptr<gun>
而不是gun *
)。这样可以动态创建各种类型的枪支并将其添加到玩家,并且不再需要枪支时就不再存在。
显然,您需要提供其他操作和错误检查(例如,如果弹药不足,则枪支不应开火;没有枪支的玩家也不得开枪等)。另外请注意,我避免使用受保护的成员-如果您提供了以受控方式访问私有成员的合适成员函数,通常就没有必要。
答案 1 :(得分:0)
首先,如果您的代码如下所示
class player {protected: gun p; };
class gun {protected: int amunition;};
class pistol : public gun {};
或者如果您没有前向声明,则编译器在编译正确的声明为时将返回错误:
class gun {protected: int amunition;};
class player {protected: gun p; };
class pistol : public gun {};
int main(){
player p;
}
出于公共目的而沉迷于此,您将无法在班级玩家上使用枪支物体 因为受到保护,您将需要公开使用属于您的此类方法,或者将枪支物体移到那里。
示例可能是:
class player
{
protected: gun p;
public:
const gun& get_gun(){
return p;
}
};
or
class player{
public:
gun p;
};