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: et ensuite je voudrais définir un tableau d'armes comme: p> 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 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> mais je reçois beaucoup d'erreurs: p> p> avec des erreurs: p> 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>
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>
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};
4 Réponses :
déclarer cela comme p>
Vous venez d'affecter des objets du type approprié, par exemple 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). P>
(Note latérale: Si vous avez des fonctions virtuelles, vous devez également ajouter un destructeur virtuel.) p> feu () code> doit être virtuel - de cette façon, si vous l'appelez, la mise en œuvre appropriée sera appelée. P>
feu void virtuel (); code> p>
arme [0] = nouveau flamer (); code> - Assurez-vous de le supprimer lorsque vous avez terminé, ou avant de réaffecter un autre objet sur la même fente. P>
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?
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]; code> et lorsque vous déclarez chaque élément du tableau,
armes [numweapon] = nouveau Flamer (paramètres); code); Code > N'oubliez pas le destructeur et n'oubliez pas de supprimer des variables allouées dynamiquement. P>
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.
#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; }
Merci de m'aider à me faire la tête autour de tout ce genre de choses.
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, p> 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 p> p>
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; code>
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.