混合成分和继承的C ++问题

时间:2018-11-02 02:45:22

标签: c++ class object inheritance composition

我必须为大学编写程序,但是在使用对象作为“班级玩家{}”的属性时遇到了麻烦。我必须使用的对象继承自父对象,并且具有一个兄弟对象:“ gun:machinegun”和“ gun:pistol”。

我了解合成的基础知识,但我不知道如何实现。

例如:

class player {protected: gun p; };
class gun {protected: int amunition;};
class pistol : public gun {};

然后,当我创建玩家时,每个玩家都应该拥有一支枪支;但我不知道该怎么做。

我无法在Internet上找到信息,因为这些示例未使用子类作为属性。我认为解决方案是将“如果”与新机枪或新手枪混合使用,但我不确定。

我还尝试在参数中使用指针而不是实例化对象,然后在if中分配一个新值;但是它没有编译,但是可能是因为还有另一个错误。如果有人可以给我一些建议,他将为我省去调试的麻烦。

谢谢。

2 个答案:

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