2016-03-10 1 views
0

J'essaye de construire mon premier jeu en C++ et j'essaye de faire un système Inventory qui me permettra de gérer et arranger différents types de données Item dans un type de conteneur Inventory . Dans le code ci-dessous je n'ai fait que les déclarations de classe, mais je voulais savoir comment faire la classe "Item" que j'ai fait contenir un type de données de l'un des différents éléments hérités tels que Weapon, Apparel, et Aid . Serait-ce aussi simple que d'utiliser un paramètre template? Si oui, alors ma question est de savoir comment quelque chose comme un Constructor comprendre ce qu'il faut faire dans chaque instance de création d'un élément? Le default Constructor peut devoir être quelque chose comme une arme de base que je décide de mettre en place, correct? Si quelqu'un a des conseils ou des liens à fournir, cela serait grandement apprécié.Comment faire un type hors des classes personnalisées héritées C++

Merci!

ITEM.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 

EDIT:

Voici ce que j'ai d'ores et déjà:

/************************************************* 
* 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: 

}; 

AUTRE EDIT: Voici le nouveau code:

/************************************************* 
* 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 
}; 
+0

Je ne parle pas de la classe d'inventaire. Je veux dire pour la variable membre de la classe Item. – Tylersong55

+0

Qu'essayez-vous de faire? – Nard

+0

Je veux comprendre comment définir la variable membre dans 'Item' de sorte qu'elle puisse être n'importe laquelle des catégories comme Arme, habillement, etc. mais je ne suis pas sûr si un modèle sera le meilleur pour cela. Mais je ne connais pas d'autre moyen de gérer quelque chose comme ça non plus. – Tylersong55

Répondre

0

O La solution consiste à définir vos types en tant que enum s.

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) {} 
}; 
+0

Alors est-ce que je voudrais rendre les variables membres privées ou protégées? Pourquoi? – Tylersong55

+0

Les membres 'protected' ne sont accessibles que par le' class' et les 'class'es dérivés. Les membres 'private' ne sont accessibles que par le' class'. Dans ce cas, 'item_type' peut être accédé par' Item', 'Weapon',' MeleeWeapon', 'RangedWeapon'. Mais si c'était «private», on ne peut y accéder que par Item. – Nard

0

Vous ne pouvez pas et ne devrait pas avoir besoin de stocker un type (type dans le sens du langage C++), utiliser des fonctions virtuelles pour obtenir ce que vous voulez.

#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'; 
} 

Voir http://cpp.sh/6cjlt

+0

Je ne sais pas si cela fonctionnerait parce que je veux obtenir diverses variables et fonctions et types pour chacun des différents éléments qui peuvent être faites. – Tylersong55