OVH Cloud OVH Cloud

Pointeurs sur fonctions

8 réponses
Avatar
Michaël Delva
Bonjour à tous,

j'ai quelques questions concernant les pointeurs:

j'ai la classe suivante:

struct Indexation_Equipe
{
AnsiString nom_equipe;
std::vector<Indexation_Joueur> liste_joueurs;
unsigned int index_equipe;
unsigned int score;

Indexation_Action action_debut,
action_fin;

bool sens_terrain;

bool operator==(const Indexation_Equipe & compar) const;

AnsiString __fastcall Get_Joueurs_En_Jeu();
};

Indexation_Equipe equipe_domicile,
equipe_exterieur;

J'utilise ensuite les pointeurs suivants:

Indexation_Equipe * equipe_attaque,
* equipe_defense,
* equipe_choisie,
* equipe_pas_choisie;

Pour affecter un pointeur, je fais par exemple equipe_attaque =
&equipe_domicile.

Mais il arrive que je doive faire equipe_attaque = equipe_choisie; ou
l'inverse.

Est-ce qu'il faut que j'ajoute un operateur d'affectation par copie, ou
bien comme ça c'est bon?

Sinon, pour être sûr:

Quand je fais equipe_choisie = equipe_attaque;, lorsque je modifie des
membres de equipe_choisie, est-ce que les changements se répercutent sur
equipe_attaque, puis sur equipe_domicile?
Même chose lorsque je modifie equipe_attaque, est-ce que equipe_choisie est
modifié également?

Je pense que c'est tout...

Merci d'avance

Mike

8 réponses

Avatar
drkm
"Michaël Delva" writes:

Bonjour à tous,

j'ai quelques questions concernant les pointeurs:


Et pas les pointeurs sur fonction, comme le laisse supposer le sujet
de ton article.

j'ai la classe suivante:

struct Indexation_Equipe
{
AnsiString nom_equipe;


As-tu réellement besoin d'AnsiString dans cette classe ?

S'il s'agit d'une classe métier, je conseillerais plutôt l'empl oit
de std::string, avec conversions aux endroits qui vont bien. Du moins
si je ne me trompe pas et qu'AnsiString est bien une classe de chez
Borland, liée à leurs classes graphiques. Mais il est vrai que je
n'ai pas toutes les données.

std::vector<Indexation_Joueur> liste_joueurs;
unsigned int index_equipe;
unsigned int score;

Indexation_Action action_debut,
action_fin;

bool sens_terrain;

bool operator==(const Indexation_Equipe & compar) const;

AnsiString __fastcall Get_Joueurs_En_Jeu();


C'est quoi, ce « __fastcall » ? C'est bizarre, je l' ai souvent vu
sur f.c.l.c++, mais la plupart du temps par des gens ne semblant pas
maîtriser le C++. Il me donne un peu l'impression de « inli ne », que
beaucoup de débutants utilisent à tout-va, et prématuré ment. Es-tu
sûr d'en avoir besoin, et surtout d'en comprendre toutes les
implications ?

};


Pourquoi utilises-tu une structure ? Je veux dire par là des champs
publiques. D'après les noms de tes champs, et les relations que
j'imagine entre eux, cela est une grave erreur de conception. Mais
encore une fois je n'ai pas toute les données (bien qu'ici je vois mal
comment justifier cela).

Indexation_Equipe equipe_domicile,
equipe_exterieur;


Tu as donc deux objets.

J'utilise ensuite les pointeurs suivants:

Indexation_Equipe * equipe_attaque,
* equipe_defense,
* equipe_choisie,
* equipe_pas_choisie;


Et quatre pointeurs. Mais toujours que deux objets.

Pour affecter un pointeur, je fais par exemple equipe_attaque =
&equipe_domicile.


Ok. Tu donnes l'adresse d'un objet comme valeur d'un pointeur.

Mais il arrive que je doive faire equipe_attaque = equipe_choisie; ou
l'inverse.


Ok. Tu donnes la valeur d'un pointeur comme valeur d'un autre
pointeur.

Est-ce qu'il faut que j'ajoute un operateur d'affectation par copie, ou
bien comme ça c'est bon?


Tu ne fais que copier des adresses. Tu ne copies pas d'objets.

Sinon, pour être sûr:

Quand je fais equipe_choisie = equipe_attaque;, lorsque je modifie des
membres de equipe_choisie, est-ce que les changements se répercutent sur
equipe_attaque, puis sur equipe_domicile?
Même chose lorsque je modifie equipe_attaque, est-ce que equipe_choi sie est
modifié également?


Non. Du moins pas comme tu l'as dit.

{
C c ;
C * p1 = & c ;
C * p2 = p1 ;
}

p1 et p2 ont la même valeur, qui est l'adresse de l'objet c. Si l'on
modifie l'objet pointé par p1, cela ne modifie pas p2 (sa valeur est
toujours la même adresse). Mais comme p1 et p2 pointent vers le mà ªme
objet, accéder à cet objet par l'un ou l'autre prend en compte les
modifications.

Mais ce n'est pas les pointeurs alors que l'on modifie, c'est
l'objet pointé par ces pointeurs. C'est la différence entre ces deux
instructions :

* p1 = ... ; // On modifie l'objet pointé.
p2 = ... ; // On modifie le pointeur.

Je pense que c'est tout...

Merci d'avance


--drkm

Avatar
Alexandre
bonjour,


Indexation_Equipe * equipe_attaque,
* equipe_defense,
* equipe_choisie,
* equipe_pas_choisie;



premier conseil : tu possèdes une variable "equipe_domicile" qui est une
valeur, et une autre "equipe_attaque" qui est un pointeur. Je te garantis
qu'un jour ou l'autre, tu vas te planter ! préfixes tes variables pointeurs
(par ex ptr_equipe_attaque ou plus court pEquipAtt) pour identifier
clairement tes pointeurs.

Pour affecter un pointeur, je fais par exemple equipe_attaque > &equipe_domicile.


Ok, si ce que tu veux est désigner par une autre manière (une sorte d'alias,
de raccourci si tu préfères) l'objet "equipe_domicile"


Mais il arrive que je doive faire equipe_attaque = equipe_choisie; ou
l'inverse.


c'est possible, mais attention : ça ne modifie pas le CONTENU de l'objet,
mais uniquement l'adresse du pointeur. Mélange de pinceaux garantis.


Est-ce qu'il faut que j'ajoute un operateur d'affectation par copie, ou
bien comme ça c'est bon?


ça dépend ce que tu veux faire...


Sinon, pour être sûr:

Quand je fais equipe_choisie = equipe_attaque;, lorsque je modifie des
membres de equipe_choisie, est-ce que les changements se répercutent sur
equipe_attaque, puis sur equipe_domicile?


Attention au vocabulaire : "equipe_choisie" étant un pointeur, il n'A PAS de
membres : c'est (*equipe_choisie) qui en a... Et c'est LE MEME objet que
equipe_domicile... Si tu fais equipe_choisie->Membre1 = 0, alors
equipe_domicile.Membre1 vaudra 0...

Même chose lorsque je modifie equipe_attaque, est-ce que equipe_choisie
est

modifié également?


encore une confusion entre adresse et valeur... Bien sur que tu ne modifies
PAS equipe_choisie (qui n'est qu'une adresse) mais l'objet POINTE par
equipe_choisie, qui est LE MEME que l'objet pointé par equipe_attaque, est
modifié en même temps.


Je pense que c'est tout...


un dernier conseil : reflechis bien sur la nature d'un pointeur.... Parce
qu'il me semble que c'est un peu confus...
Bonne chance


Merci d'avance

Mike


Avatar
Fabien LE LEZ
On Thu, 8 Jul 2004 18:31:11 +0200, "Alexandre"
:

ou plus court pEquipAtt


NOOOOOOOOOOOOOOOOOOOOOON ! Pitié ! Pas ça ! :-(
Si tu tiens vraiment à rendre ton code illisible, autant passer tous
tes noms de variables au ROT-13, ça ira plus vite.
Si tu veux garder un code lisible, utilise des noms de variables
explicites.
Le moindre PC vendu actuellement a au moins 120 Go de disque dur.
Inutile donc de tenter de grapiller quelques octets en triplant le
temps de lecture du code.


--
schtroumpf schtroumpf
Jean-Emile de France

Avatar
Arnaud Debaene
Fabien LE LEZ wrote:
On Thu, 8 Jul 2004 18:31:11 +0200, "Alexandre"
:

ou plus court pEquipAtt


NOOOOOOOOOOOOOOOOOOOOOON ! Pitié ! Pas ça ! :-(
Si tu tiens vraiment à rendre ton code illisible, autant passer tous
tes noms de variables au ROT-13, ça ira plus vite.
Si tu veux garder un code lisible, utilise des noms de variables
explicites.
Le moindre PC vendu actuellement a au moins 120 Go de disque dur.
Inutile donc de tenter de grapiller quelques octets en triplant le
temps de lecture du code.


Mais qu'est ce que tu racontes? On peut gloser at nauseam sur les faits et
méfaits de telle ou telle convention de nommage des variables (on la fait
régulièrement ici sans faire avancer le débat d'un iota d'ailleurs ;-) ,
mais en quoi la notation hongroise est-elle censée économiser l'espace
disque, comme tu semble le dire et le dénoncer ?

Arnaud


Avatar
Fabien LE LEZ
On Thu, 8 Jul 2004 20:15:59 +0200, "Arnaud Debaene"
:

mais en quoi la notation hongroise est-elle censée économiser l'espace
disque


Je ne parle pas de la notation hongroise.
Le morceau de message auquel j'ai répondu, et que j'ai donc cité, est
"ou plus court pEquipAtt".


--
schtroumpf schtroumpf
Jean-Emile de France

Avatar
Michaël Delva
Est-ce qu'il faut que j'ajoute un operateur d'affectation par copie, ou
bien comme ça c'est bon?


ça dépend ce que tu veux faire...


Dans quels cas utilise-t-on alors un operateur d'affectation? J'ai cru
comprendre que c'était lorsque l'objet possède des membres pointeurs...

Mais comme là je change l'adresse du pointeur, j'ai pas besoin de ça, j'ai
bon?

un dernier conseil : reflechis bien sur la nature d'un pointeur....
Parce qu'il me semble que c'est un peu confus...
Bonne chance


Merci d'avance

Mike



Après avoir posté ma question, j'ai fait quelques tests pour être sûr de ce
que je faisais, et il s'avère que ce que j'ai fait correspond bien à ce que
je voulais au départ, à savoir utiliser comme tu l'as dit des alias aux
variables equipe_domicile et equipe_exterieur...

Et je m'étais également rendu compte qu'utiliser equipe_choisie ou
equipe_attaque modifiait bien en fait l'objet pointé, à savoir
equipe_domicile ou equipe_exterieur...

Merci de ta réponse...


Avatar
Fabien LE LEZ
On 08 Jul 2004 22:42:44 GMT, "Michaël Delva"
:

Dans quels cas utilise-t-on alors un operateur d'affectation?


Quand l'opérateur généré par le compilateur ne fait pas ce qu'on veut.


--
schtroumpf schtroumpf
Jean-Emile de France

Avatar
Michaël Delva
Fabien LE LEZ wrote in
news::

On 08 Jul 2004 22:42:44 GMT, "Michaël Delva"
:

Dans quels cas utilise-t-on alors un operateur d'affectation?


Quand l'opérateur généré par le compilateur ne fait pas ce qu'on veut.


OK, merci...