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
| 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 ![:)](/static/smileys/smile.png)
Merci pour vos reponses!
Des que j'aurais le temps j'essaierai de corriger tout ca, je vous tiens au courant
@Ksass`Peuk j'ai essayé d'utiliser un debugger mais je n'obtient pas les mêmes ID lors des tests avec
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.
Grace a tes reponses berdes j'ai corriger mon code et tout fonctionne correctement maintenant merci a vous
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