Passage d'un pointeur en paramètre de fonction

Passage d'un pointeur en paramètre de fonction - C++ - Programmation

Marsh Posté le 28-08-2002 à 16:25:28    

:hello:  
 
Une petite question : je dois écrire une fonction, qui me renverra un pointeur vers une structure qui sera remplie dans le corps de cette fonction.
 
Je fais comme ceci :

Code :
  1. typedef struct machin {
  2. ...
  3. } TheStructure;
  4. Classe::Classe()
  5. {
  6.    TheStructure str;
  7.    Fonction (&TheStructure);
  8.    // etc...
  9. }
  10. void Classe::Fonction(TheStructure *ptr)
  11. {
  12.    // je remplis la structure
  13. }


Je suis persuadé avoir appris que le C++ permettait d'effectuer ceci d'une autre manière que celle que j'ai implémenté, qui reste quelque part du C "tout con". Mais j'ai comme un trou... [:totoz]
 
Quelqu'un a t'il plus de mémoire que moi ?  
 
 :hello:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-08-2002 à 16:25:28   

Reply

Marsh Posté le 28-08-2002 à 16:28:16    

y'a le passage par référence... Mais je suis plus sur de la syntaxe. Ca doit donner un truc du genre
 
void Classe::Fonction(TheStructure &ptr)
 
et Fonction(truc);

Reply

Marsh Posté le 28-08-2002 à 16:30:10    

et si tu declarais ta structure str comme membre de ta classe, tu ne serais pas oblige de la passer en parametre, nan?


---------------
LOVE & PEACE !!! [:kirvel]
Reply

Marsh Posté le 28-08-2002 à 16:30:34    

lorill a écrit a écrit :

y'a le passage par référence... Mais je suis plus sur de la syntaxe. Ca doit donner un truc du genre
 
void Classe::Fonction(TheStructure &ptr)
 
et Fonction(truc);  




 
c ça


---------------
Le Tyran
Reply

Marsh Posté le 28-08-2002 à 16:33:11    

Ouaiz.
C le passage par référence ce à quoi tu penses...
 

Code :
  1. typedef struct machin {
  2. ...
  3. } TheStructure;
  4. Classe::Classe()
  5. {
  6.    TheStructure str;
  7.    Fonction (TheStructure);   // pas l'adresse, ms le paramètre lui même
  8.    // etc...
  9. }
  10. void Classe::Fonction(TheStructure& _rTheStructure)
  11. {
  12.    // Ensuite, t'accèdes à "_rTheStructure" comme  
  13.    // à un param normal (pas un pointeur), style :
  14.    _rTheStructure.UnMembre = "blabla";
  15. }


 
Mais en cpp, les typedef struct ne devraient pas exister non plus. après tout, c que des ersatz de classe.
 
En fait, c comme un passage par pointeur, à 2 différencesz près :
  - on s'encombre plus avec les ->
  - on à pas à vérifier que la référence n'est pas nulle (ds ton cas, t'aurais du tester si ptr n'est pas null.

Reply

Marsh Posté le 28-08-2002 à 16:37:37    

Les références ! C'est exactement ça !! Je ne les utilise jamais et c'est un tort !!
 

Citation :


ds ton cas, t'aurais du tester si ptr n'est pas null


Je le teste, mais j'ai pas mis tout le code :)
 

Citation :


et si tu declarais ta structure str comme membre de ta classe, tu ne serais pas oblige de la passer en parametre, nan?


C'était ma 1ere idée, jusqu'a ce que je me fasse taper sur les doigts, car notre charte exige qu'on utilise un minimum les variables membres... Pourquoi ? Je sais pas, mais c'est comme ça....  :sweat:  
 

Citation :

Mais en cpp, les typedef struct ne devraient pas exister non plus. après tout, c que des ersatz de classe.  


la encore, c'est la charte...  :cry:  
 
Merci à tous  :hello:


Message édité par Harkonnen le 28-08-2002 à 16:38:28

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-08-2002 à 16:39:07    

bah eu a quoi ca sert une classe si tes instances n'ont pas d'état ?

Reply

Marsh Posté le 28-08-2002 à 16:40:28    

lorill a écrit a écrit :

bah eu a quoi ca sert une classe si tes instances n'ont pas d'état ?
 




Va demander ça à l'ingénieur qui nous sert de chef de projet ;)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-08-2002 à 23:54:00    

tu mettes tes variables dans une struct  
ca change quoi?
En C++ , struct = class que cela se sache!
 
LeGreg

Reply

Marsh Posté le 29-08-2002 à 11:18:06    

Sinon, tu peux faire un truc du genre :
 

TheStructure *str;
TheStructure=Fonction();


 
avec un malloc dans la fonction, et un destructeur quand on a fini d'utiliser la structure.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 29-08-2002 à 11:18:06   

Reply

Marsh Posté le 29-08-2002 à 11:20:39    

Jar Jar a écrit a écrit :

Sinon, tu peux faire un truc du genre :
 

TheStructure *str;
TheStructure=Fonction();


 
avec un malloc dans la fonction, et un destructeur quand on a fini d'utiliser la structure.




C'est une solution aussi. :jap:
 
Ayé, t'as ton boolay aussi ? :d


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 29-08-2002 à 11:26:08    

Harkonnen a écrit a écrit :

Ayé, t'as ton boolay aussi ? :d


Ouais, c'est une valeur sûre, celui-là :D


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 29-08-2002 à 11:31:43    

Jar Jar a écrit a écrit :

Ouais, c'est une valeur sûre, celui-là :D




Y'a Squiiid qui est dispo aussi, c du premier choix également !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-08-2002 à 03:06:27    

Et si la structure avait une méthode pour être remplie ?
 
Je crois même qu'on l'apelle operator=(...).
Il me semble aussi que pour l'initialisation on fait un truc spécial: un constructeur.
 
Mais bon, moi, ce que j'en dis...


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 30-08-2002 à 03:11:27    

Harkonnen a écrit a écrit :

 
Y'a Squiiid qui est dispo aussi, c du premier choix également !




 
Clairement, mais le choix de Jar Jar est quand même d'un niveau supérieur  [:ddr555]


---------------
Informaticien.be - Lancez des défis à vos amis
Reply

Marsh Posté le 30-08-2002 à 08:48:56    

musaran a écrit a écrit :

Et si la structure avait une méthode pour être remplie ?
 
Je crois même qu'on l'apelle operator=(...).
Il me semble aussi que pour l'initialisation on fait un truc spécial: un constructeur.
 
Mais bon, moi, ce que j'en dis...




Oui, mais moi je fais selon ce qu'on me dit hein ! :)
On a une charte bien précise, sur la manière de procéder, etc... Si tu crois que ça m'amuse de suivre des procédures à la con... :(


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-08-2002 à 10:13:48    

legreg a écrit a écrit :

tu mettes tes variables dans une struct  
ca change quoi?
En C++ , struct = class que cela se sache!
 
LeGreg




Exact : en C++, une struct est une classe dont la visibilité par défaut est publique et non privée.

Reply

Marsh Posté le 30-08-2002 à 10:25:23    

ca peut a la rigueur s'imposer si le struct en question provient
d'une librairie C, et qu'il souhaite "wrapper" sa structure dans une classe..
 
Au fait, ta question c'est peut-etre ca:
si tu as une struct MaStruc str que tu souhaites copier dans str2 alors  

Code :
  1. MaStruc str2(str);

ou  

Code :
  1. MaStruc str2;
  2. str2 = str;


 
LeGreg

Reply

Marsh Posté le 30-08-2002 à 10:31:41    

legreg a écrit a écrit :

ca peut a la rigueur s'imposer si le struct en question provient
d'une librairie C, et qu'il souhaite "wrapper" sa structure dans une classe..
 
Au fait, ta question c'est peut-etre ca:
si tu as une struct MaStruc str que tu souhaites copier dans str2 alors  

Code :
  1. MaStruc str2(str);

ou  

Code :
  1. MaStruc str2;
  2. str2 = str;


 
LeGreg



Oui, mais dans ce cas, ça risque de m'obliger à créer un constructeur de copie non ?
Car celui par défaut risque de recopier les champs par valeur, et du coup tout changement dans str ne se répecutera pas dans str2
J'espere ne pas dire de conneries, car je suis vraiment dans le gaz ce matin !!!  :cry:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-08-2002 à 10:40:41    

Code :
  1. Oui, mais dans ce cas, ça risque de m'obliger à créer un constructeur de copie non ?


 
Tu peux t'amuser a écrire un constructeur MaStruct -> MonWrapperClass (qui contient un objet MaStruct)
et aussi un operateur de conversion MonWrapperClass -> MaStruct.
Comme ca, tu pourras faire des affectations d'un type de variable vers l'autre.
 

Citation :

Car celui par défaut risque de recopier les champs par valeur, et du coup tout changement dans str ne se répecutera pas dans str2


 
?? Ben oui quand tu as deux struct a deux adresses differentes
elles vivent leur vie séparément. Je ne vois pas comment en réecrivant le constructeur de copie tu pourras y changer quoi que ce soit. Si tu veux que ce soit le meme objet utilise une reference ou un pointeur.
Evidemment si tu veux faire du traitement lors d'une recopie d'objet ou ne pas recopier tous les champs tels quels, il faudra bien entendu ecrire un operateur de copie.. Mais, ce sera celui du wrapper class puisque tu n'as apparemment pas le droit de toucher a ton struct.
 
LeGreg

Reply

Marsh Posté le 01-09-2002 à 00:21:17    

legreg a écrit a écrit :

ca peut a la rigueur s'imposer si le struct en question provient d'une librairie C, et qu'il souhaite "wrapper" sa structure dans une classe..



Dans ce cas, il suffit de dériver de cette struct et d'implémenter les constructeurs, opérateurs de copie... en terme des fonctions C  si on veut.
Tout cast sur une struct de base donne l'adresse d'une struct de base 100% conforme.

Code :
  1. //couche C
  2. struct B{
  3. int* m_pi
  4. };
  5. void Bconstruct(B* pb, int i){
  6. pb->m_pi= (int*)malloc(sizeof(int));
  7. *(pb->m_pi)= i;
  8. }
  9. void Bdestruct(B* pb){
  10. free(pb->m_pi);
  11. }
  12. B* Bassign(B* pbto, B* pbsfrom){
  13. pbto->m_pi= pbsfrom->m_pi;
  14. return pbto,
  15. }
  16. //surcouche C++
  17. struct D:B{
  18. D(int i){
  19.  Bconstruct(this, i);
  20. };
  21. ~D(){
  22.  Bdestruct(this);
  23. };
  24. D& operator=(const D& d){
  25.  Bassign(this, &d);
  26.  return *this);
  27. }
  28. };


On peut même s'amuser à faire du code double face C/C++ avec des #ifdef _cplusplus.


Message édité par Musaran le 03-09-2002 à 00:13:18

---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 01-09-2002 à 15:29:11    

musaran > ta solution est assez sympa, mais elle ne peut s'appliquer qu'a une structure, et non une classe (sans méthodes j'entends).
 
Comment gèrerais tu ce cas (en MFC, CString = chaine de caract) :
 
1 - une classe A possède une *CString en donnée membre (CString *test);
 
2 - dans le constructeur de ma classe A, j'initialise ce pointeur (test = NULL);
 
3 - je transmets ce pointeur à une méthode d'une classe B afin qu'il m'initialise la CString sur laquelle pointe ce pointeur (B.FillString(test))
 
Comment implémenterais tu B.FillString() ?


Message édité par Harkonnen le 01-09-2002 à 15:29:36

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 01-09-2002 à 15:37:04    

Harkonnen a écrit a écrit :

musaran > ta solution est assez sympa, mais elle ne peut s'appliquer qu'a une structure, et non une classe (sans méthodes j'entends).
 
Comment gèrerais tu ce cas (en MFC, CString = chaine de caract) :
 
1 - une classe A possède une *CString en donnée membre (CString *test);
 
2 - dans le constructeur de ma classe A, j'initialise ce pointeur (test = NULL);
 
3 - je transmets ce pointeur à une méthode d'une classe B afin qu'il m'initialise la CString sur laquelle pointe ce pointeur (B.FillString(test))
 
Comment implémenterais tu B.FillString() ?




C'est vraiment n'importe quoi.  
Ca viole les règles de bases de conception objet d'encapsulation.

Reply

Marsh Posté le 01-09-2002 à 15:49:21    

Verdoux a écrit a écrit :

 
C'est vraiment n'importe quoi.  
Ca viole les règles de bases de conception objet d'encapsulation.




Je suis bien d'accord avec toi, pourtant j'ai bossé pour une boite qui ne travaillait que comme ça....  :(


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-09-2002 à 07:22:05    

Quand je faisais des MFC, j'en ai très couramment dérivé les struct pour ajouter des constructeurs et éviter les oublis malencontreux.
 
Pour ta question, si j'ai bien suivi:

Code :
  1. class B;
  2. class A{
  3. public:
  4. CString * mpcstr;
  5. A():mpcstr(NULL){
  6.  //...
  7. };
  8. friend B;
  9. // friend B::FillCString(CString*&);
  10. };
  11. class B{
  12. public:
  13. void FillCString(CString*& pcstr){
  14.  pcstr= new CString("Bla !" );
  15. }
  16. void FillA(A& a){
  17.  a.mpcstr= new CString("Re-Bla !" );
  18. }
  19. };
  20. int main(){
  21. B b;
  22. A a1;
  23. A a2;
  24. b.FillCString(a1.mpcstr);
  25. b.FillA(a2);
  26. return 0;
  27. }

Mais dis-moi, B n'est-elle pas une classe allocatrice ?
c-a-d chargée de choisir ou en mémoire sont placés les éléments dynamiques ?
 
Ça expliquerait une partie de la bizarrerie de la chose.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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