Bonjour, J'ai essayé d'écrire une classe vehicule et une classe Voiture qui hérite publiquement de la classe Vehicule le code n'affiche aucun erreur quand je fait la compilation , mais dans la fenêtre noire il n'affiche rien je pense que probleme et dans l'utilisation de strlen
- Edité par Kurisu Makise 7 décembre 2019 à 17:55:04
Il y a-t-il une raison particulière à ce que tu n'utilises pas le type idoine pour les chaines de caractères en C++, à savoir std::string?
A supposer qu'un prof t'aie donné une telle consigne contre-pédagogique, découpe ton problème en sous problème. La bonne approche pour avoir un code robuste, et donc professionnel, est en plus une meilleure approche pédagogique. Si vraiment tu n'as pas le droit d'utiliser std::string, alors écrit une classe de chaine de caractères, et gères-y dedans tes chaines à la C. Gérer une ressource (char*) au niveau d'une classe métier plus complexe (voiture) est juste impossible à faire correctement (robuste, sans bug, maintenable...).
Et si tu n'as pas de prof derrière toi, alors rends-toi service et abandonnes de ce pas l'utilisation des char*, et utilises std::string. Tu verras les pointeurs bruts dans 6 mois quand tu auras consolidé tes bases en C++. A ce moment là tu seras plus mûr pour comprendre pourquoi leur manipulation directe se doit être exceptionnelle.
J'espère qu'au moins ton prof t'a bien précisé qu'il veut t'imposer l'utilisation une fonction strlenqui n'existe pas en C++ (mais comme le C++ tolère la syntaxe du langage C, il va comprendre cette fonction si on inclut <cstring> en évitant l'erreur d'utiliser <string.h>).
Pour revenir à ton code. Vois-tu la différence entre ces deux codes?
Marque = new char[ strlen(Marque) + 1 ];
strcpy( Marque, a );
Marque = new char[ strlen(a) + 1 ];
strcpy( Marque, a );
Et une autre question. C'est aussi ton prof qui conseille ces abominables 'casts' ?
une autre question stp , est ce que je dois changement le strlen dans le constructeur par recopie parce que le code ne fonctionne pas quand j'ai tester avec la classe voiture
Le problème, c'est que lorsque tu alloues avec new, tu dois obligatoirement avoir un unique delete correspondant. S'il n'y est pas, tu as une fuite de mémoire, si on ne regarde pas de trop près, ça semble marcher... sauf qu'au fil des allocations, la mémoire utilisée par le programme augmente et au bout d'un moment, tu ne peux plus faire d'allocation et boum! Le delete doit être unique, lorsque tu delete, la mémoire est rendue et peut donc être réutilisée, mais si tu refais un delete, tu libères de la mémoire qui ne t'appartient plus et qui a peut être déjà été réaffectée, c'est un comportement indéfini, au mieux ça plante tout de suite, au pire ça plante un peu plus loin en ayant eu le temps de ravager la mémoire...
Vu que Voiture dérive de Véhicule, tu as une sémantique d'entité. Une entité a une propriété intrinsèque: elle est unique! Tu es une entité, je peux te cloner, mais pas te copier, une instance de Voiture est une entité, on ne devrait pas pouvoir la copier, du coup le constructeur de copie et l'opérateur d'assignation ne devraient pas exister. Une Voiture est un Véhicule, une Moto est un Véhicule, mais une Moto n'est pas une Voiture, donc la copie n'a conceptuellement aucun sens.
En C++ moderne (c++11 et suivants), on interdit explicitement au compilateur de fournir une implémentation par défaut:
En C++ classique (avant c++11), on déclare les deux dans la partie privée de la classe, sans les implémenter. Ainsi, le compilateur ne peut plus fournir des implémentations par défaut, et si jamais ils sont utilisés, il y aura une erreur de link qui sera la conséquence d'une erreur dans le programme, étant donné que ces fonctions ne devraient pas exister dans une classe à sémantique d'entité.
Non seulement ton prof semble avoir quelques millions d'années de retard sur la programmation en c++, mais en plus ses notions de conception me paraissent être des plus limitées (pour rester courtois).
Si ton prof a lu ce sujet et qu'il n'est pas idiot, il comprendra peut être, que la sale note, ce n'est pas toi qui la mérite, mais lui... Après s'il n'est pas d'accord avec ça, il peut se créer un compte et venir parler de c++ avec nous, tu devrais d'ailleurs peut être le lui suggérer, il y apprendrait probablement pas mal de choses utiles, comme par exemple, le c++ moderne, les sémantiques de classes, le concept de RAII, SOLID,... bref le minimum vital, pour arriver à torcher un programme c++ qui ne se contentera pas de marcher dans le monde merveilleux des bisounours...
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.