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

  FORUM HardWare.fr
  Programmation
  C++

  Passage d'un pointeur en paramètre de fonction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Passage d'un pointeur en paramètre de fonction

n°204021
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 28-08-2002 à 16:25:28  profilanswer
 

: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)
mood
Publicité
Posté le 28-08-2002 à 16:25:28  profilanswer
 

n°204026
lorill
Posté le 28-08-2002 à 16:28:16  profilanswer
 

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

n°204030
try58
Posté le 28-08-2002 à 16:30:10  profilanswer
 

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]
n°204031
LetoII
Le dormeur doit se réveiller
Posté le 28-08-2002 à 16:30:34  profilanswer
 

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
n°204036
El_gringo
Posté le 28-08-2002 à 16:33:11  profilanswer
 

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.

n°204043
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 28-08-2002 à 16:37:37  profilanswer
 

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)
n°204044
lorill
Posté le 28-08-2002 à 16:39:07  profilanswer
 

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

n°204046
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 28-08-2002 à 16:40:28  profilanswer
 

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)
n°204303
LeGreg
Posté le 28-08-2002 à 23:54:00  profilanswer
 

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

n°204482
Jar Jar
Intaigriste
Posté le 29-08-2002 à 11:18:06  profilanswer
 

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
mood
Publicité
Posté le 29-08-2002 à 11:18:06  profilanswer
 

n°204486
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 29-08-2002 à 11:20:39  profilanswer
 

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)
n°204492
Jar Jar
Intaigriste
Posté le 29-08-2002 à 11:26:08  profilanswer
 

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
n°204494
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 29-08-2002 à 11:31:43  profilanswer
 

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)
n°205274
Musaran
Cerveaulté
Posté le 30-08-2002 à 03:06:27  profilanswer
 

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
n°205275
zion
Plop
Posté le 30-08-2002 à 03:11:27  profilanswer
 

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
n°205303
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 30-08-2002 à 08:48:56  profilanswer
 

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)
n°205400
BifaceMcLe​OD
The HighGlandeur
Posté le 30-08-2002 à 10:13:48  profilanswer
 

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.

n°205411
LeGreg
Posté le 30-08-2002 à 10:25:23  profilanswer
 

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

n°205414
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 30-08-2002 à 10:31:41  profilanswer
 

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)
n°205426
LeGreg
Posté le 30-08-2002 à 10:40:41  profilanswer
 

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

n°206473
Musaran
Cerveaulté
Posté le 01-09-2002 à 00:21:17  profilanswer
 

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
n°206642
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 01-09-2002 à 15:29:11  profilanswer
 

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)
n°206647
verdoux
And I'm still waiting
Posté le 01-09-2002 à 15:37:04  profilanswer
 

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.

n°206655
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 01-09-2002 à 15:49:21  profilanswer
 

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)
n°206923
Musaran
Cerveaulté
Posté le 02-09-2002 à 07:22:05  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


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

  Passage d'un pointeur en paramètre de fonction

 

Sujets relatifs
passer un champ de formulaire en parametre d'une fonctionPb avec fonction readLine() de la classe Socket PEAR
[C et Linux] Quelle fonction pour ecrire une ligne en couleur?[php] utiliser la fonction mail() en local
fonction rename() un peu capricieuse...[vb] fonction qui retourne le nom du bouton
MODIFICATION PARAMETRE INTERNETPassage de paramètres entre deux fenètres htm
Fonction TAB en html 
Plus de sujets relatifs à : Passage d'un pointeur en paramètre de fonction


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