7
votes

Est-il possible d'avoir un éventail d'objets différents provenant de la même classe de base?

J'essaie de concevoir une classe d'armes pour un jeu. Ceci est une partie du code que j'ai proposé pour répondre à mes besoins: xxx pré>

et ensuite je voudrais définir un tableau d'armes comme: p> xxx Pré>

Je voudrais que l'élément [0] représente la classe de la machine et l'élément [1] pour représenter la classe Flamer. Est-ce que je vais à propos de ce problème la bonne façon? Devrais-je refacteur cela d'une manière ou d'une autre? Comment puis-je atteindre un tableau qui détient ces deux armes différentes? P>

L'idée est donc quand j'appelle armes [0] .fire (); code> Je reçois une classe machineGun et quand J'appelle armes [1] .fire (); code> Je reçois le feu de flamer. P>


p>




edit: strong> Merci d'avoir aidé les gars. J'ai quelques problèmes d'utilisation "Armes [0] = New MachineGun;". Je reçois une erreur "Impossible d'attribuer un tableau de taille constante 0" lorsque j'essaie d'exécuter ce code. P>

Quelqu'un a-t-il un aperçu de la raison pour laquelle cela ne fonctionne pas? Mon code mis à jour semble quelque chose comme ceci: p> xxx pré>

mais je reçois beaucoup d'erreurs: p> xxx pre>

p>



J'ai pris une autre approche différente et j'ai obtenu des erreurs différentes. Je suis toujours assez sûr de savoir comment tout cela est destiné à coller ensemble. P> xxx pré>

avec des erreurs: p> xxx pré>

p>



La réponse a fini par être quelque chose comme ceci: P>

//Weapon variables
const int totalWeapons = 2;
int currentWeapon = 1;
weapon *weapons[totalWeapons] = {new machineGun, new flamer};


3 commentaires

C'est bien si vous envisagez simplement d'avoir un nombre constant de types d'armes; Vous auriez alors quelque chose comme armes [0] = nouvelle machineGun; armes [1] = nouveau flamer;


Vous avez déclaré une gamme d'armes et votre machineGun et votre flamer sont des armes. Cela ne fonctionne-t-il pas?


@isbadawi, pouvez-vous jeter un coup d'œil à mon édition, je n'arrive pas à le faire fonctionner.


4 Réponses :


2
votes

feu () doit être virtuel - de cette façon, si vous l'appelez, la mise en œuvre appropriée sera appelée.

déclarer cela comme

feu void virtuel ();

Vous venez d'affecter des objets du type approprié, par exemple arme [0] = nouveau flamer (); - Assurez-vous de le supprimer lorsque vous avez terminé, ou avant de réaffecter un autre objet sur la même fente.

Autre que cela, votre approche est exactement comment le polymorphisme doit être mis en œuvre. (Bien sûr, vous pouvez envisager un stockage différent d'un réseau de style C ou assurez-vous de mettre en œuvre la vérification des limites appropriées, mais qui dépasse la portée de votre question).

(Note latérale: Si vous avez des fonctions virtuelles, vous devez également ajouter un destructeur virtuel.)


3 commentaires

Je vais examiner cela, mais comment créer un élément [0] dans la matrice d'arme représente une classe ou l'autre?


J'ai modifié la réponse pour résoudre ce problème.


Merci d'être si utile! +1. Pouvez-vous jeter un coup d'œil à mon édition par hasard?



2
votes

pas entièrement précis. J'utiliserais des pointeurs, sinon vous aurez l'effet de trancher. C'est-à-dire que la mémoire allouée pour chaque zone de cette matrice n'est que suffisamment de mémoire pour une arme. Si MachineGun ou Flamer ont des attributs supplémentaires, ils seront «manquants» de ce qui est maintenu dans la matrice, car il n'ya pas assez de mémoire. Si vous utilisez des pointeurs et allouez de manière dynamique chaque arme dans la matrice, vous n'avez aucun problème de trancher. Donc, votre déclaration pour la matrice serait arme * armes [armes totales]; et lorsque vous déclarez chaque élément du tableau, armes [numweapon] = nouveau Flamer (paramètres); N'oubliez pas le destructeur et n'oubliez pas de supprimer des variables allouées dynamiquement.


2 commentaires

Oups, posté ma réponse trop tard. EBO déjà modifié pour refléter l'allocation dynamique.


Je suis un apprentissage de la recrue pour la première fois, je suis assez heureux d'avoir les mêmes paramètres pour les deux armes, mais merci de me donner quelque chose à penser.



5
votes
#include <iostream>

class weapon {

 public:
  int fireRate;
  int bulletDamage;
  int range;
  int activeBullet;

 public:
  virtual void fire(void) {std::cout << "machine " << '\n';}
  virtual ~weapon() {std::cout << "destructor is virtual" << '\n';}
};

class machineGun: public weapon {
 public: 
  void fire(void) {std::cout << "machine gun firing" << '\n';}
  ~machineGun(void) { std::cout << "machine gun destroyed" << '\n';}
};

class flamer: public weapon {
 public: 
  void fire(void) {std::cout << "flamer firing" << '\n';}
  ~flamer(void) {std::cout << "flamer destroyed" << '\n';}
};

int main(void)
{
    const int count = 2;
    weapon *weapons[count];

    machineGun *a = new machineGun();
    flamer     *b = new flamer();

    weapons[0] = a;
    weapons[1] = b;

    weapons[0]->fire();
    weapons[1]->fire();

    delete a;
    delete b;

}

1 commentaires

Merci de m'aider à me faire la tête autour de tout ce genre de choses.



3
votes

Comme indiqué par Ross, votre tableau doit être d'une arme de type * pour vous permettre de baisser les types d'armes spécialisées ajustées.

donc, xxx

aussi comme indiqué, Comme vous la créez de manière dynamique, vous voudrez vous assurer que vous les nettoyez plus tard ou que vous allez courir dans des fuites de mémoire


0 commentaires