有没有更好的方法来编写这个c++;代码 我对C++的技能很小。我是一个17岁的程序员,想学习C++。 我正试图做一个有趣的项目来帮助我学习C++。这段代码就是其中的一部分。我正在从一个叫做武器定义的装备基类创建一个派生类。在它里面,我想把基类中的变量带到这个类中,并在调用某个武器时给它们新的值。因此,如果短剑被调用,那么武器类对象将更改其值。然后在另一个函数中调用该武器类对象,以明确地将其值复制到其他地方。库存系统基本上就是这一切。问题是,有没有更好或更简单的方法来写这个?我这样写的想法是,我可以永远扩展它,不需要太多代码来添加或删除片段。我可以用一个新的外部类对象和类制作装备珠宝或盔甲之类的新部分
头文件有没有更好的方法来编写这个c++;代码 我对C++的技能很小。我是一个17岁的程序员,想学习C++。 我正试图做一个有趣的项目来帮助我学习C++。这段代码就是其中的一部分。我正在从一个叫做武器定义的装备基类创建一个派生类。在它里面,我想把基类中的变量带到这个类中,并在调用某个武器时给它们新的值。因此,如果短剑被调用,那么武器类对象将更改其值。然后在另一个函数中调用该武器类对象,以明确地将其值复制到其他地方。库存系统基本上就是这一切。问题是,有没有更好或更简单的方法来写这个?我这样写的想法是,我可以永远扩展它,不需要太多代码来添加或删除片段。我可以用一个新的外部类对象和类制作装备珠宝或盔甲之类的新部分,c++,class,oop,object,derived-class,C++,Class,Oop,Object,Derived Class,头文件 #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
#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
结合使用factory和builder模式,您可以执行类似的操作
#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();
}
};
#包括 阶级效应; 类修饰语; 一流设备{ 公众: 类生成器最终版本{ 公众: 生成器和设置值(int值); 建筑商和设置增长(int值); 生成器和设置标题(const std::string和title); 生成器和setTag(const std::string和tag); 建造商和附加效应(常数效应和效应); 生成器和添加修改器(常量修改器和修改器); 建造商和副本(施工设备和设备); 设备建造(); }; }; 一流设备厂{ 公众: 虚拟空生成设备(设备::生成器和生成器)=0; }; 速成工厂期末:公共设备工厂{ 公众: 无效生成设备(设备::生成器和生成器)覆盖{ builder.setValue(2) .经济增长(1) .setTitle(“短剑”) .setTag(“[轻武器]”); //.addEffect(…) //.addModifier(); } }; LongSwordFactory最终课程:公共设备工厂{ 公众: 无效生成设备(设备::生成器和生成器)覆盖{ builder.setValue(5) .setGrowth(0) .setTitle(“Longsword”) .setTag(“[重型武器]”); //.addEffect(…) //.addModifier(); } };
“有没有更好的方法来写这个C++代码”——当然。第一件事是让它编译。制作一个。通常,您的类层次结构将沿着基类的线条,其后代如武器
。您将没有“设备定义”。请考虑对长剑
标记使用一个而不是字符串。买一些。给出的代码示例告诉我,无论您现在从中学习什么,都不会给您带来任何好处。这是您第一次使用OO编程吗?看起来你应该看看基本概念,比如@user4581301,一个长词不能被所有的角色类使用,可能还有更多的武器类细节需要放在某个地方:-)我会考虑到这一点!我首先需要了解这个工厂和建设者模式,但这似乎很好,谢谢!
#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(); } };