Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
910 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  probleme avec pointeur sur objet

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

probleme avec pointeur sur objet

n°684050
cris56
Posté le 25-03-2004 à 15:54:48  profilanswer
 

voila ca fait une journée que je cherche ou est l'erreur mais rien a faire, le code ci dessous compile mais plante a l'execution
 
 

Code :
  1. #include <iostream.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. typedef class Profile
  5. {
  6. public:
  7. char* nom;
  8. char* adresse;
  9. void init();
  10. }*pProfile;
  11. void Profile::init()
  12. {
  13. char nomp[100];
  14. cout<<"entrer le nom:";
  15. cin>>nomp;
  16. nom=(char *)malloc(strlen(nomp));
  17. strcpy(nom,nomp);
  18. char adressp[100];
  19. cout<<"entrer l'adresse:";
  20. cin>>nomp;
  21. adresse=(char *)malloc(strlen(adressp));
  22. strcpy(adresse,adressp);
  23. }
  24. void main(void)
  25. {
  26. pProfile profile;
  27. profile->init();
  28. cout<<profile->nom<<"  "<<profile->adresse<<endl;
  29. }

mood
Publicité
Posté le 25-03-2004 à 15:54:48  profilanswer
 

n°684063
ffluff
Challenge Everything
Posté le 25-03-2004 à 16:05:55  profilanswer
 

pitié, faites que Taz ne passe pas par là ... paix à son âme.


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°684065
cris56
Posté le 25-03-2004 à 16:08:25  profilanswer
 

pourquoi? c'est qui taz?


Message édité par cris56 le 25-03-2004 à 16:09:38
n°684069
ffluff
Challenge Everything
Posté le 25-03-2004 à 16:11:02  profilanswer
 

dés qu'il seras arrivé ... ton pire ennemi.
 
La tu fais du C ... tu remplace class par struct, cout par printf et cin par scanf et opla t as du C.


---------------
«Le succès consiste à aller d'échecs en échecs sans jamais perdre son enthousiasme» - Churchill
n°684070
cris56
Posté le 25-03-2004 à 16:12:09  profilanswer
 

ben non c'est du c++, ya une classe, on peut pas faire ca en c?

n°684090
SomeBugsIn​Me
life suxx
Posté le 25-03-2004 à 16:46:45  profilanswer
 

cris56 a écrit :


 
void Profile::init()
{
 char nomp[100];
 cout<<"entrer le nom:";
 cin>>nomp;
 nom=(char *)malloc(strlen(nomp)+1);
 strcpy(nom,nomp);
 
 char adressp[100];
 cout<<"entrer l'adresse:";
 cin>>adressp;
 adresse=(char *)malloc(strlen(adressp)+1);
 strcpy(adresse,adressp);
}
 


 
mais bon ton code est très laid.
On peut pas appeler ça du C++...


Message édité par SomeBugsInMe le 25-03-2004 à 16:48:49
n°684092
gilou
Modérateur
Modzilla
Posté le 25-03-2004 à 16:47:37  profilanswer
 

Sinon, pour ton pb:
> nom=(char *)malloc(strlen(nomp));  
 
Ca serait pas  
nom=(char *)malloc(strlen(nomp)+1);  
 :whistle:  
 
Maintenant, si tu veux vraiment que ce soit du c++, vaudrait mieux faire un truc de ce genre:

Code :
  1. #include <iostream>
  2. #include <string>
  3. using std::cin;
  4. using std::cout;
  5. using std::endl;
  6. using std::string;
  7. class User_profile
  8. {
  9. public:
  10.   string nom;
  11.   string adresse;
  12.   void init();
  13. };
  14. void User_profile::init()
  15. {
  16.     cout<<"entrer le nom:"<<endl;
  17.     cin>>nom;
  18.     cout<<"entrer l'adresse:"<<endl;
  19.     cin>>adresse;
  20. }
  21. int main()
  22. {
  23.   User_profile profile;
  24.   profile.init();
  25.   cout<<profile.nom<<"  "<<profile.adresse<<endl;
  26. }


 
J'ai pas de compilo c++ sous la main pour verifier que ca passe correctement, mais ca te donnera une idée du style a employer...
A+,

n°684103
pascal_
Posté le 25-03-2004 à 17:00:25  profilanswer
 

cris56 a écrit :

Code :
  1. void main(void)
  2. {
  3. pProfile profile;
  4. profile->init();
  5. cout<<profile->nom<<"  "<<profile->adresse<<endl;
  6. }




 
En plus dans le main, profile n'est jamais initialisé !
Fallait déjà écrire un truc genre  
pProfile profile = new Profile;
 

n°684107
Taz
bisounours-codeur
Posté le 25-03-2004 à 17:04:36  profilanswer
 

cris56 a écrit :

ben non c'est du c++, ya une classe, on peut pas faire ca en c?

ton code est du C (et du mauvais) à part les cout...
 
1 bon point pour gilou. seulement moi, seulement c'est plus propre de séparer E/S et stockage de données.
 
donc le mieux, est de

Code :
  1. cout<<"entrer le nom:"<<flush; 
  2. cin>>nom; 
  3. cout<<"entrer l'adresse:"<<flush 
  4. cin>>adresse; 
  5. Profile prof(nom, addresse);
  6. prof.grincheux();

n°684145
cris56
Posté le 25-03-2004 à 17:32:59  profilanswer
 

merci a tous pour vos reponse, j'ai arrange ca en suivant vos conseil mais du coup je suis plus du tout sur, je connais pas tout ca
 

Code :
  1. #include <iostream>
  2. #include <string>
  3. using std::cin;
  4. using std::cout;
  5. using std::endl;
  6. using std::string;
  7. using std::flush;
  8. class Profile
  9. {
  10. string nom;
  11. string adresse;
  12. public:
  13. Profile(const string& p_nom,const string& p_adresse)
  14. {
  15.  adresse=p_adresse;
  16.  nom=p_nom;
  17. };
  18. string getNom() const
  19. {
  20.  return nom;
  21. };
  22. string getAdresse() const
  23. {
  24.  return adresse;
  25. };
  26. };
  27. int main()
  28. {
  29. string nom,adresse;
  30. cout<<"entrer le nom:"<<flush; 
  31. cin>>nom; 
  32. cout<<"entrer l'adresse:"<<flush;
  33. cin>>adresse;
  34. Profile profile(nom,adresse);
  35. cout<<profile.getNom()<<"  "<<profile.getAdresse()<<endl;
  36. }


Message édité par cris56 le 25-03-2004 à 17:42:08
mood
Publicité
Posté le 25-03-2004 à 17:32:59  profilanswer
 

n°684147
Taz
bisounours-codeur
Posté le 25-03-2004 à 17:36:01  profilanswer
 

bon, allez, on va dire que ça va

n°684154
cris56
Posté le 25-03-2004 à 17:39:54  profilanswer
 

merci,
flush c'est pour vider le tampon, donc tu fait ca avant une saisie, c'est ca?
 
sinon pour le constructeur, j'ai vu qu'on pouvais faire ca :
 
Profile(string p_nom,string p_adresse): adresse(p_adresse),nom(p_nom){};
 
quel est l'avantage ?
 
j'ai passer les string par reference dans le constructeur (voir maj de l'autre post), c'est mieux ou inutile?


Message édité par cris56 le 25-03-2004 à 17:43:18
n°684166
Taz
bisounours-codeur
Posté le 25-03-2004 à 17:44:04  profilanswer
 

cris56 a écrit :

merci,
flush c'est pour vider le tampon, donc tu fait ca avant une saisie, c'est ca?

oui. cout est généralement bufferisé en mode ligne, donc quand tu fais un cout sans '\n' suivi d'un cin, il vaut mieux flusher pour que l'affichage se fasse bien avant la saisie

cris56 a écrit :


 
Profile(const string &p_nom, const string &p_adresse): adresse(p_adresse),nom(p_nom){};
 
quel est l'avantage ?

1) les const & évite la copie inutile des paramètres
2) c'est la synthaxe d'initialization. sinon, chaque champ est d'abord construit implicitement (comme si tu écrivait adresse(), puis operator=, etc ... la syntaxe d'initialisation est simple, logique, et 3x fois plus rapide

n°684173
cris56
Posté le 25-03-2004 à 17:49:41  profilanswer
 

a ouai d'accord, c'est bon a savoir ca
 
sinon encore une question (desole, c'est la derniere)
 
pour les accesseur je retourne un objet string par valeur, mais je devrai plutot retourner par reference aussi, non?
 
en tout cas je te remerci pour tout ces eclaircissement

n°684175
Taz
bisounours-codeur
Posté le 25-03-2004 à 17:51:02  profilanswer
 

si tu peux. à ce moment là, retourne une const&

n°684178
cris56
Posté le 25-03-2004 à 17:54:25  profilanswer
 

le const a quel utilite a ce moment la? pourquoi il vaut mieux le mettre en retour?
(c'est peut etre  con ce que je dit mais sur la plupart des sources que je vois le const est omis pour une valeur retour par reference...)

n°684181
Taz
bisounours-codeur
Posté le 25-03-2004 à 17:57:06  profilanswer
 

ben si tu renvoie une & seule, tu permets aussi l'accès en écriture (à moins que ce ne soit ce que tu veux)

n°684185
cris56
Posté le 25-03-2004 à 18:01:54  profilanswer
 

ok, oui en effet je ne desir pas proteger par un const pour le moment

n°684197
gilou
Modérateur
Modzilla
Posté le 25-03-2004 à 18:18:03  profilanswer
 

> c'est plus propre de séparer E/S et stockage de données
 
J'allais pas tout lui faire non plus...
 
Sinon j'aurais fait quelque chose comme:
 

Code :
  1. #include <iostream> 
  2. #include <string> 
  3. using std::cin;
  4. using std::cout;
  5. using std::endl;
  6. using std::flush;
  7. using std::string;
  8. class UserProfile 
  9. string nom; 
  10. string adresse;
  11. public:
  12. UserProfile(const string& n, const string& a) : nom(n), adresse(a) {}
  13. void print() const;
  14. }; 
  15. void UserProfile::print() const
  16. {
  17.   cout<<nom<<"  "<<adresse<<endl;
  18. }
  19. int main() 
  20. string nom;
  21. string adresse;
  22.   cout<<"entrer le nom:"<<flush; 
  23.   cin>>nom; 
  24.   cout<<endl;
  25.   cout<<"entrer l'adresse:"<<flush; 
  26.   cin>>adresse; 
  27.   cout<<endl;
  28.   UserProfile profile(nom, adresse);
  29.   profile.print(); 
  30. }


 
EDIT: Ah je vois que c'est a peu pres a quoi le topic est arrive pendant mon absence (pour bechage de poireaux)  
 
A+,


Message édité par gilou le 25-03-2004 à 18:57:26
n°684200
Taz
bisounours-codeur
Posté le 25-03-2004 à 18:20:16  profilanswer
 

la tu t'es planté gilou.  

Code :
  1. void UserProfile::print(ostream &os) const
  2.   {
  3.       os << nom << "  " << adresse << '\n';
  4.   }
  5. prof.print(cout);


 
après tu peux rajouter

Code :
  1. inline ostream& operator<<(ostream &os, const Profile &p)
  2. { p.print(os); return os; }


 
cout << prof;
 

n°684203
gilou
Modérateur
Modzilla
Posté le 25-03-2004 à 18:22:42  profilanswer
 

> la tu t'es planté gilou.
 
Au sens que je l'ai pas fait assez generique pour ton gout?? J'ai pas essaye de sortir de son pb initial, sinon il y aurait aussi des accesseurs par champ dans la classe.
A+,


Message édité par gilou le 25-03-2004 à 18:23:53
n°684204
Taz
bisounours-codeur
Posté le 25-03-2004 à 18:23:56  profilanswer
 

gilou a écrit :

> la tu t'es planté gilou.
 
Au sens que je l'ai pas fait assez generique pour ton gout??
A+,

oui, et qu'il manquait un const

n°684208
cris56
Posté le 25-03-2004 à 18:28:03  profilanswer
 

moi j aurai penseé au const  :D
 
sinon je vait voir ca pour le cout<<prof

n°684211
gilou
Modérateur
Modzilla
Posté le 25-03-2004 à 18:32:42  profilanswer
 

Taz a écrit :

oui, et qu'il manquait un const

:o Argh! I was Tazed!
C'est un oubli dont je suis coutumier quand je me relis pas celui là.
Je vas editer mon post original.
(Pour etre honnete, pour le print, j'avais bien pense a une fonction generique avec un ostream lors de mon premier post, mais j'avais eu la flemme de la taper, :whistle: )
A+,


Message édité par gilou le 25-03-2004 à 18:59:18
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  probleme avec pointeur sur objet

 

Sujets relatifs
[C] Problème pour obtenir l'@ IPProbleme html
Un probleme avec unserialize( )Problème pour signer une applet : pb avec jarsigner
probleme avec la couleur de fond d'un DIV...Probleme avec cette merd... de easy php/ myadmin
probleme avec iostream.h dans visual.netHelp : Probleme PHP : tableaux et variables!
Probleme au niveau des classes...Problème de connection à une base de données Oracle
Plus de sujets relatifs à : probleme avec pointeur sur objet


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR