【问题标题】:How to make a type out of inherited custom classes c++如何从继承的自定义类 c++ 中创建类型
【发布时间】:2016-03-10 03:47:32
【问题描述】:

我正在尝试用 C++ 构建我的第一个游戏,并且我正在尝试制作一个 Inventory 系统,该系统将允许我在 Inventory 容器类型中管理和安排不同的 Item 数据类型。在下面的代码中,我只编写了类声明,但我想知道如何使我创建的“Item”类包含任何不同继承项的数据类型,例如WeaponApparelAid 类别。会像使用template 参数一样简单吗?如果是这样,那么我的问题是Constructor 之类的东西如何理解在创建项目的每个实例中要做什么? default Constructor 可能必须是我决定设置的基本武器,对吗?如果有人有任何建议或链接提供,将不胜感激。

谢谢!

项目.H:

#ifndef ITEM_H
#define ITEM_H

#include <iostream>

/*************************************************
* ITEM CLASS
* *This class is the type of data to be put into
*  the Inventory Container class.
**************************************************/
class Item
{
public:

private:

};

/*************************************************
* WEAPON CLASS
* *This class is a type of Item that classifies a
*  weapon item that can be in an Inventory.
**************************************************/
class Weapon : public Item
{
public:

private:

};

/*************************************************
* APPAREL CLASS
* *This class is a type of Item that classifies an
*  apparel item that can be in an Inventory.
**************************************************/
class Apparel : public Item
{
public:

private:

};

/*************************************************
* AID CLASS
* *This class is a type of Item that classifies an
*  Aid item that can be in an Inventory.
**************************************************/
class Aid : public Item
{
public:

private:

};

#endif //ITEM_H

编辑:

这是我现在所拥有的:

/*************************************************
* ITEM CLASS
* *This class is the type of data to be put into
*  the Inventory Container class.
**************************************************/
template <class T>
class Item
{
public:


private:
    T item_type;         //i.e. Weapon, Apparel, Aid, etc...

};

/*****************************************************************
* ITEM : WEAPON 
* *Below is the code for all the different Weapon classes.
******************************************************************/

/*************************************************
* WEAPON CLASS
* *This class is a type of Item that classifies a
*  weapon item that can be in an Inventory.
**************************************************/
template <class T>
class Weapon : public Item
{
public:

private:
    T weapon_type;      //i.e. Melee, Ranged, etc...
};

/*************************************************
* MELEE CLASS
* *This class is a type of Item that classifies a
*  melee item that will be used as a weapon.
**************************************************/
template <class T>
class Melee : public Weapon
{
public:

private:

};

/*************************************************
* RANGED CLASS
* *This class is a type of Item that classifies a
*  ranged item that will be used as a weapon.
**************************************************/
template <class T>
class Ranged : public Weapon
{
public:

private:

};

另一个编辑: 这是最新的代码:

/*************************************************
* ITEM CLASS
* *This class is the type of data to be put into
*  the Inventory Container class.
**************************************************/
template <class T>
class Item
{
public:


protected:
    T item_type;         //i.e. Weapon, Apparel, Aid, etc...

};

/*****************************************************************
* ITEM : WEAPON 
* *Below is the code for all the different Weapon classes.
******************************************************************/

//WEAPON CLASS
template <class T>
class Weapon : public Item
{
public:

protected:
    T weapon_type;      //i.e. Melee, Ranged, etc...
};

//MELEE CLASS
template <class T>
class Melee : public Weapon
{
public:

protected:
    T melee_type;      //i.e. Blade, Blunt, Fist, etc...

};

//BLADE CLASS
template <class T>
class Blade : public Melee
{
public:

protected:
    T blade_type;      //i.e. Dagger, Sword, etc...
};

//DAGGER CLASS
template <class T>
class Dagger : public Blade
{
public:
    //Default Constructor...the only Constructor
    Dagger() : damage(1), weight(0.5) { }

    //getters
    std::string getType() const { return "Dagger"; }

protected:
    int   damage;      //amount of damage it can inflict
    float weight;      //weight of the dagger
};

【问题讨论】:

  • 我不是在谈论 Inventory 类。我的意思是 Item 类中的成员变量。
  • 你想做什么?
  • 我想弄清楚如何在Item 中设置成员变量,以便它可以是任何类别,如武器、服装等,但我不确定模板是否是最适合它。但我也不知道有什么其他方法可以处理类似的事情。
  • @songyuanyao 是的。这就是我的意思。
  • 我在继承列表中放置的模板是否应该有不同的字母?所以像物品 -> 武器 -> 近战 -> 剑......他们每个人应该有不同的模板参数吗?

标签: c++ templates inventory


【解决方案1】:

一种解决方案是将您的类型定义为enums。

enum ITEM_TYPE { IT_WEAPON, IT_END };
enum WEAPON_TYPE { WT_MELEE, WT_RANGED, WT_END };

class Item {
public:
    Item(ITEM_TYPE type) : item_type(type) {}
protected:
    ITEM_TYPE item_type;
};

class Weapon : public Item {
public:
    Weapon(WEAPON_TYPE type) : Item(IT_WEAPON), weapon_type(type) {}
protected:
    WEAPON_TYPE weapon_type;
};

class MeleeWeapon : public Weapon {
public:
    MeleeWeapon() : Weapon(WT_MELEE) {}
};

class RangedWeapon : public Weapon {
public:
    RangedWeapon() : Weapon(WT_RANGED) {}
};

【讨论】:

  • 那么我想让成员变量私有还是受保护?为什么?
  • protected 成员只能由class 和任何派生的classes 访问。 private 成员只能由 class 访问。在这种情况下,item_type 可以通过ItemWeaponMeleeWeaponRangedWeapon 访问。但如果是private,则只能Item访问。
【解决方案2】:

您不能也不应该需要存储类型(C++ 语言意义上的类型),使用虚函数来实现您想要的。

#include <iostream>
#include <memory>
#include <vector>

class Item
{
public:
     virtual const char* type() const = 0;
};

class Weapon : public Item
{
public:
      const char* type() const override { return "Weapon"; }
};

class Ranged : public Weapon
{
public:
    const char* type() const override { return "Ranged"; }
};

class Melee : public Weapon
{
public:
    const char* type() const override { return "Melee"; }
};

class Apparel : public Item
{
public:
    const char* type() const override { return "Apparel"; }
};

int main()
{
    std::vector<std::unique_ptr<Item>> items;

    items.emplace_back(new Apparel());
    items.emplace_back(new Ranged());
    items.emplace_back(new Melee());

    std::cout << "Inventory Types:\n";
    for (const auto& it: items)
        std::cout << it->type() << '\n';
}

http://cpp.sh/6cjlt

【讨论】:

  • 我不知道这是否可行,因为我想为每个可以制作的不同项目获取各种变量、函数和类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多