是否有编写此c ++代码的更好方法

问题描述 投票:0回答:1

*我对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;
}

c++ class oop object derived-class
1个回答
0
投票

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

#include <string>

class Effect;
class Modifier;

class Equipment {
 public:
  class Builder final {
   public:
    void setValue(int value);
    void setGrowth(int value);
    void setTitle(const std::string& title);
    void setTag(const std::string& tag);
    void addEffect(const Effect& effect);
    void addModifier(const Modifier& modifier);
    void 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);
    builder.setGrowth(1);
    builder.setTitle("Shortsword");
    builder.setTag("[Light Weapon]");

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

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

    // builder.addEffect(...)
    // builder.addModifier();
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.