c++ constructeur / compilation

c++ constructeur / compilation - C++ - Programmation

Marsh Posté le 22-12-2010 à 09:15:44    

Salut,
 
bete question peut etre mais ca fait longtemps que je n'ai pas touche a du c++ :)
 
Si je declare une instance c d'une classe C comme membre d'une autre classe D, est-ce que le constructeur de C sera appele pendant la compilation ou bien autre chose se passe?
 
Ma question est due au fait que j'avais un probleme qui a ete resolu en passant c de C a C*, et en appelant le constructeur de C a la main plus tard.
 
Merci!


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 22-12-2010 à 09:15:44   

Reply

Marsh Posté le 22-12-2010 à 09:40:25    

gee a écrit :

Salut,
 
bete question peut etre mais ca fait longtemps que je n'ai pas touche a du c++ :)
 
Si je declare une instance c d'une classe C comme membre d'une autre classe D, est-ce que le constructeur de C sera appele pendant la compilation ou bien autre chose se passe?
 
Ma question est due au fait que j'avais un probleme qui a ete resolu en passant c de C a C*, et en appelant le constructeur de C a la main plus tard.
 
Merci!


 
 
Salut,
 
Rien n'est appelé à la compilation. Tu as surement voulu dire à la construction de D.
 
Sinon oui, le constructeur de C est appelé à la construction de D de façon implicite. Tu peux appeler explicitement un autre constructeur de C dans le constructeur de D de la façon suivante :
 
 

Code :
  1. class C{
  2. C();
  3. C ( const int param );
  4. };
  5. class D{
  6.   D();
  7.   C toto;
  8. };
  9. D::D() : C( 2 )
  10. {
  11. }


 
 
Sinon, tu peux aussi faire comme tu as dit, déclarer un pointeur sur C dans D , et instancier C à la main où tu veux dans D ( y compris dans le constructeur ).

Reply

Marsh Posté le 22-12-2010 à 10:09:30    

Ah mais c'est fort dommage cela.
Comment declarer des valeurs par defaut dans un constructeur s'il est uniquement appele par "new" ?

 

En gros :
C c; => pas de valeurs par defaut possibles pour les members de C
C* c = new C => valeurs par defaut.

 

C'est bien cela?

 

Pour la possibilite d'appeler un autre constructeur je ne savais pas c'est sympa!

 

Merci bien!

Message cité 1 fois
Message édité par gee le 22-12-2010 à 10:10:31

---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 22-12-2010 à 10:16:49    

gee a écrit :

Ah mais c'est fort dommage cela.
Comment declarer des valeurs par defaut dans un constructeur s'il est uniquement appele par "new" ?
 
En gros :
C c; => pas de valeurs par defaut possibles pour les members de C
C* c = new C => valeurs par defaut.
 
C'est bien cela?
 
Pour la possibilite d'appeler un autre constructeur je ne savais pas c'est sympa!
 
Merci bien!


 
 
Si si, je n'ai peut être pas été clair. Si tu n'appelles pas de constructeur de C dans le constructeur de D, alors le constructeur par défaut de C est appelé implicitement.
 

Reply

Marsh Posté le 22-12-2010 à 10:26:06    

C c1(2); // valeur par défaut dans ton objet allouée sur la pile
C* c2 = new C( 2 ); // valeur par défaut dans ton objet alloué sur le tas


---------------
last.fm
Reply

Marsh Posté le 22-12-2010 à 11:14:25    

Donc C c1; appele aussi le contructeur defaut, celui sans parametre?
 
Si c'est le cas, c'est ce que je voulais mais alors je ne comprend pas mon bug :)
 
 
Merci!


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 22-12-2010 à 11:20:13    

En gros mon code est ainsi:
 
D.h:

Code :
  1. Class D {
  2. public:
  3. D();
  4. private:
  5. C c;
  6. };


 
d.cpp:

Code :
  1. D::D()
  2. {
  3. }


 
 
 
 
C.h:

Code :
  1. Class C{
  2. public:
  3. C();
  4. void UneFonction();
  5. private:
  6. R* r;
  7. };


 
C.pp

Code :
  1. #include <C.h>
  2. C::C()
  3. {
  4. r = R::Singleton();
  5. }
  6. void C::UneFonction()
  7. {
  8. r->UneAutreFonction();
  9. }


 
 
le r->UneAutreFonction() plante dans ce cas, mais si je passe le membre C de C a C* dans D, tout se passe bien (dans tous les cas D d est cree par un new, donc sur la pile).
 
Enfin je ne sais pas si c'est plus clair la :D
Le probleme est peut etre l'utilisation du singleton dans un constructeur utilise par compilation et non pas sur la pile?


Message édité par gee le 22-12-2010 à 11:21:43

---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 22-12-2010 à 11:35:11    

en debug, combien vaut r  dans la fonction C::UneFonction() ?
 
As-tu un autre constructeur déclaré dans C ?
 
Est ce que tu as bien la syntaxe du constructeur par défaut et non autre chose ? Car sinon, le constructeur D appelle implicitement le constructeur par défaut C , qui , si tu ne l'as pas ou mal déclaré , sera implicite aussi.

Reply

Marsh Posté le 22-12-2010 à 11:39:46    

1- je n'ai pas encore trouve comment utilise le debugger sous kdevelop donc je ne sais pas, mais je vais regarder :jap:
 
2- Pour un autre constructeur non, uniquement le defaut.


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 22-12-2010 à 11:45:08    

je viens d'écrire ton code, il fonctionne sans problème.
 

Code :
  1. #include <stdio.h>
  2. class R
  3. {
  4. public :
  5. R();
  6. static R* Singleton();
  7. void A();
  8. private :
  9. static R * myinstance;
  10. };
  11. R * R::myinstance = NULL;
  12. R* R::Singleton()
  13. {
  14. return new R();
  15. }
  16. R::R()
  17. {
  18. }
  19. void R::A()
  20. {
  21. printf("toto\n" );
  22. }
  23. class C
  24. {
  25. public :
  26. C();
  27. void UneFonction();
  28. private :
  29. R *r;
  30. };
  31. C::C()
  32. {
  33. r = R::Singleton();
  34. }
  35. void
  36. C::UneFonction()
  37. {
  38. r->A();
  39. }
  40. class D
  41. {
  42. public :
  43. D();
  44. private :
  45. C c;
  46. };
  47. D::D()
  48. {
  49. c.UneFonction();
  50. }
  51. int main()
  52. {
  53. D *d = new D();
  54. return 0;
  55. }


 
Affiche bien toto ( aucune vérification / désallocation , etc ... crade mais juste pour mettre en oeuvre ce que tu souhaites faire ).

Reply

Marsh Posté le 22-12-2010 à 11:45:08   

Reply

Marsh Posté le 22-12-2010 à 11:50:23    

Hmmmm faudra que je re-regarde apres dormir alors, peut etre que le fait qu'il soit 3h du mat me fasse zapper un truc important.
 
Dans tous les cas merci bien pour ton aide :)
 
A demain!


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 23-12-2010 à 10:07:20    

Je suis de retour :D
 
Donc j'ai reflechi a l'example et a mon vrai code, j'ai fait un petit test et trouve une difference et je crois que c'est cela.
 
 
Donc en fait pour le singleton j'ai 2 fonctions importantes:
- Instance() qui me donne l'instance de ma classe si elle existe, et sinon qui plante (un peu bizarre pour un singleton mais la suivante explique).
- Instantiate(string s, int i) qui cree une instance si elle n'existe pas, et utilise les parametres. Comme je n'ai pas envie de passer ces parametres a toutes les classes qui appele Instance, j'ai fait une 2nd fonction qui est appele au debut du programme. Est-ce mauvais?
 
Donc:
Quand C se construit et appelle R::Instance(), R::Instanciate(s,i) n'a pas encore ete appelee vu que cela se passe dans le programme et non la compilation et donc R::Instance() me retourne 0 (au lieu de planter, hmm j'imagine qu'un exit(0) sur une fonction appelee a la compilation n'est pas tres ruse).
Ca tiens la route tout cela?
 
 
Merci


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 23-12-2010 à 11:22:08    

tu confonds encore un peu compilation et execution. Aucune fonction n'est appelé à la compilation.

Reply

Marsh Posté le 23-12-2010 à 11:38:07    

C'est vrai.
Mais alors a quel moment est appele le constructeur par defaut de mes classes qui  sont  sur la pile?


Message édité par gee le 23-12-2010 à 11:45:57

---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 23-12-2010 à 11:41:04    

Si tes instances de classe ne sont pas sur la pile, c'est que soit tu les alloues sur le tas ( new ), dans ce cas , tu sais exactement à quel moment le constructeur est appelé, soit ce sont des variables globales, dans ce cas, c'est juste avant l'entrée dans le main. Donc dans tous les cas, à l'exécution ( au début ou non ).
 
Le danger est de déclarer plusieurs objets en variable globale, tu ne connais pas l'ordre d'appel des constructeurs.


Message édité par xilebo le 23-12-2010 à 11:43:32
Reply

Marsh Posté le 23-12-2010 à 11:49:12    

Oooh je vois.
 
Ca parait donc une mauvaise idee de dependre de l'ordre d'execution de constructeurs non appeles avec new.
 
Merci beaucoup pour toutes ces explications ca aide!


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Sujets relatifs:

Leave a Replay

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