*我对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;
}
结合使用工厂和构建器模式,您可以执行以下操作
#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();
}
};