Probleme incrementation int

Le problème exposé dans ce sujet a été résolu.

Bonjour, Je m'essaie au Javaquarium en c++ mais dans le code disponible ici j'ai un probleme lors de l'incremantation de Fish::nextID.

Lors de la creation des poissons chaque poisson a un unique ID (ca c'est bon) mais les valeurs sont incoherentes:

` Tour n 1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
There are 11 seaweeds in the aquarium

There are 4 fishes in the aquarium :

Georges is a Male (ID:0)

Georgette is a Female (ID:1952728280)

Georges2 is a Male (ID:1952730096)

Georgette2 is a Female (ID:0)`

Est ce que quelqu'un peut m'expliquer pourquoi j'obtiens ces valeurs s'il vous plait.

Au passage je suis ouvert a toute critique sur le code.

Bonne soiree a vous

Lu'!

Pour comprendre ce qui se passe dans l'exécution d'un programme, le mieux est encore de l'exécuter avec un debugger pour tracer les événements.

En tout cas, ici, un des problèmes principaux (pas sûr que ça vienne de là, j'ai pas tout regardé), c'est que tu fais des copies de poisson. Or tes poissons sont des entités, pas des valeurs, elles devraient donc être non-copiables (et non affectables par copie). Et c'est la même chose pour tes algues.

Ça viens de ton constructeur de copie de ta classe Fish: tu n'initialises pas l'ID. Au passage, si ton poisson est sensé avoir un identifiant unique, il ne devrait pas être possible de le copier.

Remarques générales de forme:

  • Quand tu donnes du code comme ça, il est recommandé d'y ajouter le nécessaire pour compiler le projet, souvent sous forme d'un Makefile (ou équivalent). Si tu te contentes de compiler à la main, tu peux simplement fournir la liste des commandes utilisés.
  • Le formatage de ton code n'est pas consistant: à certains endroits, tu mets un espace après les virgules (paramètres de fonction) et à d'autre tu n'en mets pas (constructeurs). Dans Fish::getID, il n'y a pas d'espace avant const alors qu'il y en a partout ailleurs. Il existe des outils qui formatent le code automatiquement, si ça peut t'aider. Je pense notamment à clang-format.
  • Pour des raisons de lisibilité (et parfois de performance), il est courant de définir les méthodes courtes dans le .hpp. La limite étant souvent de l'ordre de 5-10 lignes.
  • Pareil pour l'initialisation de ta variable statique: tu peux le faire dans le .hpp.
  • Toujours pour des raisons de lisibilités, il est bien de mettre le nom des paramètres lors de la déclaration des fonctions/méthodes.
  • J'ai du mal à voir l'utilité de std::string getName() quand tu as déjà std::string getName() const. Si tu veux que l'utilisateur puisse modifier le nom, implémente un setter.
  • Pourquoi tu as une méthode print pour l'aquarium et uniquement operator<< pour tes poissons?
  • Le constructeur de Fish devrait prendre des références constantes plutôt que des copies.
  • Pareil pour ta boucle for dans l'aquarium: ta référence devrait être constante.

Pour le fond:

  • À propos de l'identifiant unique de ta classe Fish, je te recommande d'avoir une méthode qui génère un nouvel identifiant et de ne jamais accéder à ta variable statique autre part. Ça t'évitera d'oublier d'incrémenter ta variable.
  • Ta variable Fish::nextID ne devrait pas être publique.
  • Pourquoi utiliser un vecteur de pointeurs pour tes poissons? Si tes poissons changeaient de "propriétaire" souvent et qu'ils étaient coûteux à copier, ça pourrait se comprendre, mais ce n'est pas le cas ici. Au passage, utiliser des pointeurs, ça risque aussi de compliquer le code. Désolé, j'ai complètement oublié la partie héritage. Si tu veux tout de même utiliser des pointeurs, il faudrait les utiliser tout le temps. Dans ce cas, tu ne devrais pas avoir une méthode addFish(const Fish&) mais plus quelque chose comme addFish(std::unique_ptr<Fish>&&).
  • Ça semble étrange que tu ais un vecteur de unique_ptr pour les poissons et un vecteur d'objets pour les algues.
  • Plutôt que d'implémenter tous les constructeurs de tes poissons dans l'aquarium, tu peux utiliser la magie des template et faire quelque chose similaire à std::vector::emplace_back.

Voilà, je pense que c'est tout pour l'instant :)

Puisque tu n'initialises pas l'ID, tu te retrouve à utiliser de la mémoire non initialisé. C'est donc potentiellement n'importe quoi, donc c'est normal de ne pas avoir la même chose entre les différentes exécutions de ton programme. Mais c'est aussi tout à fait possible de se retrouver avec la même chose si ton OS te donne la même partie de la mémoire entre les exécutions.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte