Questions sur les classes et les types char *

Fermé
ousmane - 26 mai 2003 à 17:53
 pouet - 28 mai 2003 à 10:47
Bonjour,
Voilà mon probléme.
je veux developper un petit prog de gestion d'une bibliothéque.
je crée une classe Livre avec ses méthodes et ses attributs dont certains sont char*
y'a pas de probléme de compilation mais à l'execution, il n'affiche pas bien les attributs de type char * comme nom,referrence,auteur du Livre.
Veuillez svp m'indiquer la source du probléme ou comment y remedier.
voici le code .

#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#define Nmax 100

typedef char string[20];

typedef struct

{
int annee;
int mois;
int jour;
} date;
class Livre

{
int numlivre;
string nom;
string ref;
string Auteur;
date dateEmprunt;
date dateRetour;
public :
Livre(int=0,char *,char *,char *,date,date);
Livre (Livre &);
void affiche();

};

Livre :: Livre(int num,char *nom1,char *ref1,char *auteur1,date date1,date date2)
{
numlivre=num;
strcpy(nom1,nom);
strcpy(ref1,ref);
strcpy(Auteur,auteur1);
dateEmprunt.jour=date1.jour;
dateEmprunt.mois=date1.mois;
dateEmprunt.annee=date1.annee;
dateRetour.jour=date2.jour;
dateRetour.annee=date2.annee;
dateRetour.mois=date2.mois;
};



Livre :: Livre(Livre &s)
{
numlivre=s.numlivre;
strcpy(nom,s.nom);
strcpy(ref,s.ref);
strcpy(Auteur,s.Auteur);
dateEmprunt.jour=s.dateEmprunt.jour;
dateEmprunt.mois=s.dateEmprunt.mois;
dateEmprunt.annee=s.dateEmprunt.annee;
dateRetour.jour=s.dateRetour.jour;
dateRetour.mois=s.dateRetour.mois;
dateRetour.annee=s.dateRetour.annee;
};

void Livre :: affiche()

{
cout << "\nLe nom du livre : " ;
cout << nom;
cout << "\nL'auteur du livre : ";
cout << Auteur;
cout << "\nLa referrence du Livre : ";
cout << ref;
cout << "\nDate d'emprunt : ";
cout <<dateEmprunt.jour<< " "<<dateEmprunt.mois<<" "<<dateEmprunt.annee<<endl;
cout <<"\nDate de Retour ";
cout <<dateRetour.jour<<" "<<dateRetour.mois<<" "<<dateRetour.annee<<endl;

};

void main()
{
clrscr();
string nom1,ref1,auteur1;
Livre *L;
int num1=1;
cout<<"Nom du Livre N : ";
cin>>nom1;
cout <<"Referrence du Livre : ";cin>>ref1;
cout << "Auteur du Livre : ";cin>>auteur1;
date date5={0,0,0};
date date7;
cout << "Entrer la date d'Emprunt jour mois annee : ";
cin>>date7.jour;fflush(stdin);cin>>date7.mois;fflush(stdin);cin>>date7.annee;
Livre LL(num1,nom1,ref1,auteur1,date7,date5);
LL.affiche();
getch();
}
A voir également:

6 réponses

bonsoir,

avant toute chose, peux tu me donner le nom de ton compilateur, que je sois sur de ne jamais l utiliser?
le code que tu as fourni ne compile pas. si ton compilo ne te fais aucun warning c est grave.

reprenons ton code pas a pas. je mets les commentaires en dessous de ce qui est commente.

#include <iostream.h>
/*
en c++ c est juste
#include <iostream>
*/
#include <string.h>
#include <conio.h>
/* ca c est pas du c++, tu deblaies. */
#include <stdio.h>
#define Nmax 100

typedef char string[20];
/* hu? */
typedef struct

{
int annee;
int mois;
int jour;
} date;
class Livre

{
int numlivre;
/*
il vaut mieux mettre les accesseurs en public en haut, et les attributs en private en bas. on peut aussi preceder les attributs de _, c est une convention, mais ce la simplifie la vie.*/
string nom;
string ref;
string Auteur;
date dateEmprunt;
date dateRetour;
public :
Livre(int=0,char *,char *,char *,date,date);
Livre (Livre &);
/* en c++, le constructeur par copie est definit automatiquement */
void affiche();

};

Livre :: Livre(int num,char *nom1,char *ref1,char *auteur1,date date1,date date2)
{
/* ref1, num1, a proscrire, ce n est pas du tout explicite */
numlivre=num;
strcpy(nom1,nom);
/* c est du C */
strcpy(ref1,ref);
strcpy(Auteur,auteur1);
dateEmprunt.jour=date1.jour;
dateEmprunt.mois=date1.mois;
dateEmprunt.annee=date1.annee;
dateRetour.jour=date2.jour;
dateRetour.annee=date2.annee;
dateRetour.mois=date2.mois;
};



Livre :: Livre(Livre &s)
{
numlivre=s.numlivre;
strcpy(nom,s.nom);
strcpy(ref,s.ref);
strcpy(Auteur,s.Auteur);
dateEmprunt.jour=s.dateEmprunt.jour;
dateEmprunt.mois=s.dateEmprunt.mois;
dateEmprunt.annee=s.dateEmprunt.annee;
dateRetour.jour=s.dateRetour.jour;
dateRetour.mois=s.dateRetour.mois;
dateRetour.annee=s.dateRetour.annee;
};

void Livre :: affiche()

{
cout << "\nLe nom du livre : " ;
/* tu n as pas defini de namespace par defaut, donc:
std::cout */
cout << nom;
cout << "\nL'auteur du livre : ";
/* pas de \n, mais std::endl
*/
cout << Auteur;
cout << "\nLa referrence du Livre : ";
cout << ref;
cout << "\nDate d'emprunt : ";
cout <<dateEmprunt.jour<< " "<<dateEmprunt.mois<<" "<<dateEmprunt.annee<<endl;
cout <<"\nDate de Retour ";
cout <<dateRetour.jour<<" "<<dateRetour.mois<<" "<<dateRetour.annee<<endl;

};

void main()
/* ca n existe pas. main a deux prototypes:
int main(void)
et
int main(int argc, char *argv[])
*/
{
clrscr();
/* ce n est pas du c++ */
string nom1,ref1,auteur1;
Livre *L;
/* pas utilise donc deblaie */
int num1=1;
cout<<"Nom du Livre N : ";
cin>>nom1;
cout <<"Referrence du Livre : ";cin>>ref1;
cout << "Auteur du Livre : ";cin>>auteur1;
date date5={0,0,0};
date date7;
cout << "Entrer la date d'Emprunt jour mois annee : ";
cin>>date7.jour;fflush(stdin);cin>>date7.mois;fflush(stdin);cin>>date7.annee;
/* le comportement de fflush(stdin) n est pas defini par la norme.
a proscrire donc
*/
Livre LL(num1,nom1,ref1,auteur1,date7,date5);
LL.affiche();
getch();
/* ca n est pas du C++ */
}

je crois que c est tout.
et comme je sais que ca passe mieux avec un exemple, voici la meme chose en c++:

#include <iostream>
#include <string>
#include <stdio.h>
#define Nmax 100


typedef struct
{
int annee;
int mois;
int jour;
} date;


class Livre
{
public :
Livre(std::string nom, std::string ref, std::string auteur, date date_emprunt, date date_retour, int num = 0) :
_numlivre (num),
_nom (nom),
_ref (ref),
_auteur (auteur)
{
_dateEmprunt.jour = date_emprunt.jour;
_dateEmprunt.mois = date_emprunt.mois;
_dateEmprunt.annee = date_emprunt.annee;
_dateRetour.jour = date_retour.jour;
_dateRetour.annee = date_retour.annee;
_dateRetour.mois = date_retour.mois;
}
void affiche();
private:
int _numlivre;
std::string _nom;
std::string _ref;
std::string _auteur;
date _dateEmprunt;
date _dateRetour;
};

void Livre :: affiche()
{
std::cout << "Le nom du livre : "
<< _nom
<< std::endl;

std::cout << "L'auteur du livre : "
<< _auteur
<< std::endl;

std::cout << "La referrence du Livre : "
<< _ref
<< std::endl;

std::cout << "Date d'emprunt : "
<< _dateEmprunt.jour
<< " "
<< _dateEmprunt.mois
<< " "
<< _dateEmprunt.annee
<< std::endl;

std::cout << "Date de Retour "
<< _dateRetour.jour
<< " "
<< _dateRetour.mois
<< " "
<< _dateRetour.annee
<< std::endl;
};

int main(void)
{
std::string nom1, ref1, auteur1;
int num1 = 1;
std::cout<<"Nom du Livre N : ";
std::cin >> nom1;
std::cout <<"Referrence du Livre : ";
std::cin >> ref1;
std::cout << "Auteur du Livre : ";
std::cin >> auteur1;
date date5 = {0,0,0};
date date7;
std::cout << "Entrer la date d'Emprunt jour : ";
std::cin >> date7.jour;
std::cout << "Entrer la date d'Emprunt mois : ";
std::cin >> date7.mois;
std::cout << "Entrer la date d'Emprunt annee : ";
std::cin >> date7.annee;
Livre LL(nom1,ref1,auteur1,date7,date5, num1);
LL.affiche();
return 0;
}

j espere que je ne me suis pas trompe dans le copier/coller.

--
pouet
0
salut
ça compile bien et y'a pas de warning.
j'utilise le turbo C++ de Borland.
0
pouet > ousmane
27 mai 2003 à 00:15
>ça compile bien et y'a pas de warning.
c est dommage, s il y en avait eu, tu aurais trouve tes erreurs.

>j'utilise le turbo C++ de Borland.
peut etre n as tu pas active des options de compilation pour afficher tous les warnings?
sinon change de compilo.
tu peux jeter un coup d oeil ici:
http://www.bloodshed.net/dev/index.html
pour etre honnete je ne l ai pas essaye, mais comme ils disent que c est base sur un port de gcc, ca doit etre bien.

--
pouet
0
dis moi plutôt les options qu'il faut activer dans le turbo cpp.
je pensai que le cpp inclut toutes les fonctionalités du C, raison pour laquelle tout ce qui passe en C doit passé en cpp(c evolué).
c'est koi le namespace par défaut
Je n'ai pas compris le std que tu mets dans ton code et la définition de tes classes.
0
>dis moi plutôt les options qu'il faut activer dans le turbo cpp.
et bien il faut activer les warnings. mais ca depend de ton compilateur que je n utilise pas.

>je pensai que le cpp inclut toutes les fonctionalités du C, raison pour >laquelle tout ce qui passe en C doit passé en cpp(c evolué).
c est c++. pratiquement oui. la grammaire du c++ couvre celle du c, donc a partir du moment ou tu utilises les memes bibliotheques, ca a le meme resultat. maintenant le c++ ajoute des classes sympa comme std::string, ce serait bete de ne pas les utiliser.

>c'est koi le namespace par défaut
il n y en a pas.
>Je n'ai pas compris le std que tu mets dans ton code et la définition de tes classes.
std est un namespace.
http://w3imagis.imag.fr/Membres/Xavier.Decoret/STL_TUTORIAL/introduction.html
0
ok merci,
tu veux dire donc que string est déjà prédefini en c++.
sinon, réponds svp à la question initiale qui est l'objet de ce post.
0
>tu veux dire donc que string est déjà prédefini en c++.
std::string oui. et c est _bien_

>sinon, réponds svp à la question initiale qui est l'objet de ce post.
on dit: "pourrais tu".
ton constructeur de Livre n est pas bon.
et le code n est pas bon en general.
quand ca compile sans warning alors tu peux commencer a te poser des questions.
et (bis) si ton compilo ne te les signale pas => /dev/null
voila.

--
pouet
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bon j'ai reponds svp=s'il vous plaît qui n'est donc pas une obligation
mais bref y'a certes mieux!!!
si ça compile sans erreur, ni warning, cela veut dire que c'est bon à mon avis!!!
sinon pour ta correction
est ce qu'on a le droit d'ecrire cela :
_numlivre (num), /* pour moi c'est _numlivre=num*/
_nom (nom), /*strcpy(_nom,nom)*/
_ref (ref), pareil que ci-dessus
_auteur (auteur)
0
reponds = imperatif = ordre

>si ça compile sans erreur, ni warning,
>cela veut dire que c'est bon à mon avis!!!
non malheureusement :)
et de toutes facons:
guillaume@fallen:~$ g++-3.2 -Wall -ansi test.cc
In file included from /usr/include/c++/3.2/backward/iostream.h:31,
from test.cc:1:
/usr/include/c++/3.2/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.
test.cc:3:19: conio.h: No such file or directory
test.cc:26: default argument missing for parameter 2 of `Livre::Livre(int = 0,
char*, char*, char*, date, date)'
test.cc: In constructor `Livre::Livre(int, char*, char*, char*, date, date)':
test.cc:33: default argument missing for parameter 2 of `Livre::Livre(int = 0,
char*, char*, char*, date, date)'
test.cc: At global scope:
test.cc:79: `main' must return `int'
test.cc:79: return type for `main' changed to `int'
test.cc: In function `int main(...)':
test.cc:80: `clrscr' undeclared (first use this function)
test.cc:80: (Each undeclared identifier is reported only once for each function
it appears in.)
test.cc:94: `getch' undeclared (first use this function)
test.cc:82: warning: unused variable `Livre*L'

ca me semble pas mal comme warnings non?

>est ce qu'on a le droit d'ecrire cela :
>_numlivre (num), /* pour moi c'est _numlivre=num*/
oui on a le droit.
ce que tu proposes est une affectation.
moi je fais appel au constructeur par copie.
"programmation c++ par la pratique" de o'reilly est pas mal.

--
pouet
0
je pense que c'est un probléme de compilateur.
je suppose que tu as le gcc ou cc sous linux(unix).
mais dis moi as-tu le probléme que je signale au premier post dans le code que tu as corrigé.
merci d'avance!!!
0
>je pense que c'est un probléme de compilateur.
oui, turbo c++ ne signale pas du code incorrect.

>je suppose que tu as le gcc ou cc sous linux(unix).
>mais dis moi as-tu le probléme que je signale
>au premier post dans le code que tu as corrigé.
non. (quand on corrige un code en general c est pour enleveer les erreurs).
cela dis tu peux le constater par toi meme:
1/copier
2/coller
3/compiler

--
pouet
0