有没有更好的方式编写此c ++代码

时间:2019-11-18 20:47:10

标签: c++ class oop object derived-class

*我对C ++的掌握很少。我是一个17岁的程序员,尝试学习c ++。

我正在尝试创建一个有趣的项目来帮助我学习c ++。这段代码就是其中的一些结果。我正在从称为Weapon_definition的设备基类创建派生类。在其中,我想将基类中的变量带入此类,并在调用某种武器时为其赋予新值。因此,如果调用了短剑,那么武器类对象将更改其值。然后在另一个函数中调用此武器类对象,其明确目的是将其值复制到其他位置。这几乎就是一个库存系统。问题本身就是这,是否有更好或更简单的方式来编写此代码?我这样写是因为我可以永远扩展它,并且不需要花费太多代码来添加或删除片段。我可以使用新的外部类对象和类来制作新的部分,例如适用的珠宝或盔甲。

头文件

#ifndef EQUIPMENT_H
#define EQUIPMENT_H
#include <string>

class Equipment_definition{
  public:
  int value;
  int growth;
  std::string Tag;
  std::string Title;
};

class Weapon_definition: public Equipment_definition{
  public:
  static void Short_Sword();
  static void Long_Sword();  
};

extern Weapon_definition Weapon;



#endif

CPP文件

#include "Equipment.h"

Weapon_definition Weapon;

void Weapon_definition::Short_Sword(){
  Weapon.Title = "Shortsword";
  Weapon.Tag = "[Light Weapon]";
  Weapon.value = 2;
  Weapon.growth = 1;
}

void Weapon_definition::Long_Sword(){
  Weapon.Title = "Longsword";
  Weapon.Tag = "[Heavy Weapon]";
  Weapon.value = 5;
  Weapon.growth = 0;
}

1 个答案:

答案 0 :(得分:1)

结合使用工厂模式和构建器模式,您可以执行以下操作

#include <string>

class Effect;
class Modifier;

class Equipment {
 public:
  class Builder final {
   public:
    Builder& setValue(int value);
    Builder& setGrowth(int value);
    Builder& setTitle(const std::string& title);
    Builder& setTag(const std::string& tag);
    Builder& addEffect(const Effect& effect);
    Builder& addModifier(const Modifier& modifier);
    Builder& copy(const Equipment& equipment);
    Equipment build();
  };
};

class EquipmentFactory {
 public:
  virtual void generateEquipment(Equipment::Builder& builder) = 0;
};

class ShortSwordFactory final : public EquipmentFactory {
 public:
  void generateEquipment(Equipment::Builder& builder) override {
    builder.setValue(2)
        .setGrowth(1)
        .setTitle("Shortsword")
        .setTag("[Light Weapon]");

    // .addEffect(...)
    // .addModifier();
  }
};

class LongSwordFactory final : public EquipmentFactory {
 public:
  void generateEquipment(Equipment::Builder& builder) override {
    builder.setValue(5)
        .setGrowth(0)
        .setTitle("Longsword")
        .setTag("[Heavy Weapon]");

    // .addEffect(...)
    // .addModifier();
  }
};