probleme avec pointeur sur objet

probleme avec pointeur sur objet - C++ - Programmation

Marsh Posté le 25-03-2004 à 15:54:48    

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. }

Reply

Marsh Posté le 25-03-2004 à 15:54:48   

Reply

Marsh Posté le 25-03-2004 à 16:05:55    

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
Reply

Marsh Posté le 25-03-2004 à 16:08:25    

pourquoi? c'est qui taz?


Message édité par cris56 le 25-03-2004 à 16:09:38
Reply

Marsh Posté le 25-03-2004 à 16:11:02    

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
Reply

Marsh Posté le 25-03-2004 à 16:12:09    

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

Reply

Marsh Posté le 25-03-2004 à 16:46:45    

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
Reply

Marsh Posté le 25-03-2004 à 16:47:37    

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+,

Reply

Marsh Posté le 25-03-2004 à 17:00:25    

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;
 

Reply

Marsh Posté le 25-03-2004 à 17:04:36    

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();

Reply

Marsh Posté le 25-03-2004 à 17:32:59    

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
Reply

Marsh Posté le 25-03-2004 à 17:32:59   

Reply

Marsh Posté le 25-03-2004 à 17:36:01    

bon, allez, on va dire que ça va

Reply

Marsh Posté le 25-03-2004 à 17:39:54    

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
Reply

Marsh Posté le 25-03-2004 à 17:44:04    

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

Reply

Marsh Posté le 25-03-2004 à 17:49:41    

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

Reply

Marsh Posté le 25-03-2004 à 17:51:02    

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

Reply

Marsh Posté le 25-03-2004 à 17:54:25    

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...)

Reply

Marsh Posté le 25-03-2004 à 17:57:06    

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

Reply

Marsh Posté le 25-03-2004 à 18:01:54    

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

Reply

Marsh Posté le 25-03-2004 à 18:18:03    

> 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
Reply

Marsh Posté le 25-03-2004 à 18:20:16    

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;
 

Reply

Marsh Posté le 25-03-2004 à 18:22:42    

> 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
Reply

Marsh Posté le 25-03-2004 à 18:23:56    

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

Reply

Marsh Posté le 25-03-2004 à 18:28:03    

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

Reply

Marsh Posté le 25-03-2004 à 18:32:42    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed