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

  FORUM HardWare.fr
  Programmation
  C++

  c++ constructeur / compilation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

c++ constructeur / compilation

n°2043652
gee
Bon ben hon
Posté le 22-12-2010 à 09:15:44  profilanswer
 

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!"
mood
Publicité
Posté le 22-12-2010 à 09:15:44  profilanswer
 

n°2043657
xilebo
noone
Posté le 22-12-2010 à 09:40:25  profilanswer
 

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

n°2043660
gee
Bon ben hon
Posté le 22-12-2010 à 10:09:30  profilanswer
 

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!"
n°2043661
xilebo
noone
Posté le 22-12-2010 à 10:16:49  profilanswer
 

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.
 

n°2043662
theshockwa​ve
I work at a firm named Koslow
Posté le 22-12-2010 à 10:26:06  profilanswer
 

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
n°2043675
gee
Bon ben hon
Posté le 22-12-2010 à 11:14:25  profilanswer
 

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!"
n°2043679
gee
Bon ben hon
Posté le 22-12-2010 à 11:20:13  profilanswer
 

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!"
n°2043690
xilebo
noone
Posté le 22-12-2010 à 11:35:11  profilanswer
 

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.

n°2043693
gee
Bon ben hon
Posté le 22-12-2010 à 11:39:46  profilanswer
 

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!"
n°2043695
xilebo
noone
Posté le 22-12-2010 à 11:45:08  profilanswer
 

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

mood
Publicité
Posté le 22-12-2010 à 11:45:08  profilanswer
 

n°2043696
gee
Bon ben hon
Posté le 22-12-2010 à 11:50:23  profilanswer
 

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!"
n°2043936
gee
Bon ben hon
Posté le 23-12-2010 à 10:07:20  profilanswer
 

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!"
n°2043981
Joel F
Real men use unique_ptr
Posté le 23-12-2010 à 11:22:08  profilanswer
 

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

n°2043991
gee
Bon ben hon
Posté le 23-12-2010 à 11:38:07  profilanswer
 

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!"
n°2043993
xilebo
noone
Posté le 23-12-2010 à 11:41:04  profilanswer
 

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
n°2044002
gee
Bon ben hon
Posté le 23-12-2010 à 11:49:12  profilanswer
 

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!"

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

  c++ constructeur / compilation

 

Sujets relatifs
ereeur de compilationCompilation Flex+Java
Compilation d'un fichier d'aide HTML (chm)Question con sur une exception dans un constructeur
Pourquoi ne peut-on pas hériter du constructeur d'une class mère ?Probleme de compilation visual c++ 2008
Problème de compilationErreur de compilation incompréhensible!!!!
Probleme de compilationImpossible d'executer un programme après compilation (DLL manquante)
Plus de sujets relatifs à : c++ constructeur / compilation


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