【问题标题】:Is there a better way of writing this c++ code有没有更好的方法来编写这个 c++ 代码
【发布时间】:2020-03-14 07:12:54
【问题描述】:

*我的 C++ 技能很少。我是一名 17 岁的程序员,正在尝试学习 c++。

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

头文件

#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++ 代码" - 当然。第一件事是让它编译。创建minimal reproducible example
  • 通常情况下,您的类层次结构将沿着基类Weapon 的线条,并带有诸如Long_sword 之类的后代。你不会有“设备定义”。
  • 考虑使用enumerated type 而不是Tag 的字符串。获取一些solid reference materials。给出的代码示例告诉我,无论你现在从中学到什么,都对你没有任何帮助。
  • 这是您第一次使用 OO 进行编程吗?看来您应该看一下Inheritance之类的基本概念
  • @user4581301 长剑不能被所有角色职业使用,可能有更多的武器类别细节需要放在某个地方:-)

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


【解决方案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();
  }
};

【讨论】:

  • 我会考虑到这一点!我首先需要阅读有关此工厂和构建器模式的信息,但这看起来很不错,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2020-03-18
  • 1970-01-01
  • 2013-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多