Char* et strlen
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
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
#include<iostream> #include<string.h> using namespace std; class Vehicule{ protected : char *Matricule; char *Marque; int AnneeModele; float PrixHT; public: Vehicule(); Vehicule(char *,char *,int, float); ~Vehicule(); void afficher(); void setPrixHT(float p);//modifier prixHT float getPrixTTC(); //retourne PrixHT*1.2 }; Vehicule::Vehicule(){ } Vehicule::Vehicule(char *f,char *a,int b, float c){ AnneeModele=b; PrixHT=c; char *Matricule =new char[strlen(Matricule)+1]; strcpy(Matricule,f); char *Marque =new char[strlen(Marque)+1]; strcpy(Marque,a); /*for(int i=0;i<strlen(Marque)+1;i++){ Marque[i]=a[i]; } for(int i=0;i<strlen(Matricule)+1;i++){ Matricule[i]=f[i]; }*/ } Vehicule::~Vehicule(){ cout<<"supprimer Matricule"; delete []Matricule; cout<<"supprimer Marque"; delete []Marque; } void Vehicule::afficher(){ cout<<"le Matricule est :"; for(int i=0;i<strlen(Matricule)+1;i++){ cout<<Matricule[i]; } cout<<"la Marque est :"; for(int i=0;i<strlen(Marque)+1;i++){ cout<<Marque[i]; } cout<<"AnneeModele est :"<<AnneeModele<<endl; cout<<"PrixHT est :"<<PrixHT<<endl; } void Vehicule::setPrixHT(float p){ PrixHT=p; } float Vehicule::getPrixTTC(){ return PrixHT*1.2; } class Voiture:public Vehicule{ int nbrePlace; public: Voiture(); Voiture(char *,char *,int, float,int); Voiture(Voiture const &); void affiche(); }; Voiture::Voiture(){} Voiture::Voiture(char *f,char *a,int b, float c,int d){ Vehicule(f,a,b,c); nbrePlace=d; } Voiture::Voiture(Voiture const &f){ Marque=new char[strlen(f.Marque)]; strcpy(Marque,f.Marque); Matricule=new char[strlen(f.Matricule)]; strcpy(Matricule,f.Matricule); /*for(int i=0;i<strlen(f.Marque)+1;i++){ Marque[i]=f.Marque[i]; } for(int i=0;i<strlen(f.Matricule)+1;i++){ Matricule[i]=f.Matricule[i]; }*/ nbrePlace=f.nbrePlace; AnneeModele=f.AnneeModele; PrixHT=f.PrixHT; } void Voiture::affiche(){ cout<<"teste"; Vehicule::afficher(); cout<<"le nbrePlace est :"<<nbrePlace<<endl; /* int cmp=0; cmp++; cout<<"le nombre de voiture est :";*/ } int main(int argc,char *argv[]){ Voiture V1((char *)"1234-A-50",(char *)"Fiat",100000,2007,5); V1.affiche(); return 0; }
A voir également:
- Char* et strlen
- Coco char - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Convertir char en int c ✓ - Forum C
- Char(10) excel francais ✓ - Forum Excel
- [C]- convertir char en int ✓ - Forum C
1 réponse
Bonjour,
Vu que tu codes en C++ pourquoi n'utilises pas l'objet
Voici une implémentation bien plus simple :
... ce qui donne à l'exécution :
Quelques remarques :
Bonne chance
Vu que tu codes en C++ pourquoi n'utilises pas l'objet
std::stringqui t'éviterait tous ces soucis ?
Voici une implémentation bien plus simple :
#include <iostream> #include <ostream> #include <string> class vehicule_t { std::string matricule; std::string marque; unsigned annee_modele; float prix_ht; public: vehicule_t(){} vehicule_t( const char *matricule, const char *marque, unsigned annee_modele, float prix_ht ): matricule(matricule), marque(marque), annee_modele(annee_modele), prix_ht(prix_ht) {} inline const std::string & get_matricule() const { return this->matricule; } inline const std::string & get_marque() const { return this->marque; } inline unsigned get_annee_modele() const { return this->annee_modele; } inline float get_prix_ht() const { return this->prix_ht; } }; std::ostream & operator << (std::ostream & out, const vehicule_t & v) { out << "<" << v.get_matricule() << ", " << v.get_marque() << ", " << v.get_annee_modele() << ", " << v.get_prix_ht() << ">"; return out; } int main() { vehicule_t v1("666 xy 75", "ferrari", 2018, 100000); std::cout << v1 << std::endl; return 0; }
... ce qui donne à l'exécution :
(mando@aldur) (~) $ g++ vehicule.cpp
(mando@aldur) (~) $ ./a.out
<666 xy 75, ferrari, 2018, 100000>
Quelques remarques :
- Dans le constructeur, on prend un
const char *
pour ne pas imposer l'utilisation destd::string
. - En C++ on travaille surtout avec des références au niveau des paramètres. Cela évite de passer une recopie en paramètre (comme le ferait un passage par pointeur), mais en ayant la même syntaxe que si on avait passer l'instance elle même (contrairement au passage par pointeur). Une autre différence est qu'une référence est toujours initialisée et ne peut jamais être "nulle", comme pourrait l'être un pointeur.
- Que l'on utilise des pointeurs ou des références, attention à être rigoureux avec les
const
(paramètres non modifiés). Unconst
situé devant l'accolade ouvrante d'une méthode signifie que*this
n'est pas modifié. - Les méthodes "triviales" et courtes (getters...) peuvent être
inline
. Cela permet de les implémenter directement dans le header (.hpp) de la classe, contrairement aux méthodes ordinaires qui elles, doivent être implémentées dans le fichier source (.cpp) afin d'éviter des définitions multiples à la compilation.
Bonne chance