Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Références au lieu de pointeurs

11 réponses
Avatar
Zouplaz
Bon, je l'ai tellement lu et on me l'a tellement dit que je vais quand même
faire l'effort de comprendre comment utiliser des références en lieu et
place des pointeurs.

J'ai du mal à comprendre comment me passer de l'allocation dynamique.
Par exemple, par quoi remplacer quelque chose d'aussi simple que ça ?

typeObj *unObj;

void uneFonction()
{
for(i=0;i<42;i++)
{
unObj = new typeObj();
monVecteur.push_back(unObj);
}
}

Avec des références (donc sans le new ?) comment je fais pour créer des
"instances" et remplir le tableau ??
Je vais quand même pas y placer des copies d'objets ? si (beurk ?) ?

10 réponses

1 2
Avatar
Vincent Richard

J'ai du mal à comprendre comment me passer de l'allocation dynamique.
Par exemple, par quoi remplacer quelque chose d'aussi simple que ça ?

typeObj *unObj;

void uneFonction()
{
for(i=0;i<42;i++)
{
unObj = new typeObj();
monVecteur.push_back(unObj);
}
}

Avec des références (donc sans le new ?) comment je fais pour créer des
"instances" et remplir le tableau ??


Il me semble que ce n'est pas possible. On peut seulement initialiser des
références, et pas les affecter. Donc, des tableaux de références ce n'est
pas faisable.

Mais il ne faut pas vouloir se passer à tout prix des pointeurs. Pour ma
part j'utilise des références pour "dialoguer" avec l'utilisateur. En
interne, mes bibliothèques utilisent des vecteurs de pointeurs sur des
objets.

Je vais quand même pas y placer des copies d'objets ? si (beurk ?) ?


Tout dépend de comment sont implémentés tes objets. Si les données ne sont
pas copiées, mais juste référencées, la copie n'est pas plus lourde (un peu
comme le fait std::string avec le COW).

Vincent

--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

Avatar
Fabien LE LEZ
On 02 Nov 2003 10:57:01 GMT, Zouplaz wrote:

Par exemple, par quoi remplacer quelque chose d'aussi simple que ça ?

typeObj *unObj;

void uneFonction()
{
for(i=0;i<42;i++)
{
unObj = new typeObj();
monVecteur.push_back(unObj);


J'ai bien du mal à comprendre ton code. Pourquoi "unObj" est-il une
variable globale au lieu d'être une variable locale à la fonction,
initilisée au moment de sa déclaration ?

Ensuite, je ne suis pas d'accord avec le mot "simple". Tu utilises un
vector de pointeurs, ce qui laisse à penser que "typeObj" a une
sémantique d'entité (je ne vois pas d'autre explication ici), et a
pour conséquence qu'il va falloir détruire tous les objets pointés au
moment de la destruction du tableau -- et donc bien repérer les
endroits où le tableau peut être détruit.

Enfin, pour répondre à ta question, en cas d'allocation dynamique, les
pointeurs conviennent mieux que les références (et les pointeurs
intelligents encore mieux dans certains cas).
Les références servent surtout pour le passage de paramètres aux
fonctions, quand un passage par valeur ne convient pas. Exemple :

void CopieChaine (std::string& dest, std::string const& src)
{
dest= src;
}

--
;-)

Avatar
Fabien LE LEZ
On 02 Nov 2003 10:57:01 GMT, Zouplaz wrote:

Je vais quand même pas y placer des copies d'objets ?


Ben si. C'est l'utilisation canonique de std::vector et compagnie.
De toutes façons même un pointeur est un objet.

--
;-)

Avatar
Zouplaz
Fabien LE LEZ - :

On 02 Nov 2003 10:57:01 GMT, Zouplaz wrote:

Par exemple, par quoi remplacer quelque chose d'aussi simple que ça ?

typeObj *unObj;

void uneFonction()
{
for(i=0;i<42;i++)
{
unObj = new typeObj();
monVecteur.push_back(unObj);


J'ai bien du mal à comprendre ton code. Pourquoi "unObj" est-il une
variable globale au lieu d'être une variable locale à la fonction,
initilisée au moment de sa déclaration ?



Heu, erreur de typo !! Ca devrait être une variable locale...

Ensuite, je ne suis pas d'accord avec le mot "simple". Tu utilises un
vector de pointeurs, ce qui laisse à penser que "typeObj" a une
sémantique d'entité (je ne vois pas d'autre explication ici), et a
pour conséquence qu'il va falloir détruire tous les objets pointés au
moment de la destruction du tableau -- et donc bien repérer les
endroits où le tableau peut être détruit.



Oui, chaque instance d'objet est "propriétaire" (à un instant T) d'un
certain nombre d'autres instances. Dans le destructeur de chaque instance
je parcours le vecteur et détruis les objets qu'il contient.

Ca donne quelque chose comme ça :

Monde -> propriétaire de -> Lieux
Lieu -> propriétaire de -> objets et personnages dans Lieu
Objet -> propriétaire de -> objets contenus
Personnage -> propriétaire de -> objets transportés

A la fin de l'appli je fais un delete myWorld (Monde) et en cascade ça
descend la hiérarchie.

Enfin, pour répondre à ta question, en cas d'allocation dynamique, les
pointeurs conviennent mieux que les références (et les pointeurs
intelligents encore mieux dans certains cas).
Les références servent surtout pour le passage de paramètres aux
fonctions, quand un passage par valeur ne convient pas. Exemple :

void CopieChaine (std::string& dest, std::string const& src)
{
dest= src;
}



Ha ! Quand même ! C'est ce que je croyais avoir compris mais hier encore
je lisais un ebook disant "pointeur = pas bon-caca-beurk-moche, on peut
s'en passer TOTALEMENT" et franchement j'ai beau tourner le problème dans
tous les sens je vois pas comment !

Donc, définitivement les pointeurs sont utiles et il y a des cas
(fréquents on dirait) pour lesquels on est bien obligés de s'en servir
!?!?


Avatar
Zouplaz
Vincent Richard - :


Mais il ne faut pas vouloir se passer à tout prix des pointeurs. Pour
ma part j'utilise des références pour "dialoguer" avec l'utilisateur.
En interne, mes bibliothèques utilisent des vecteurs de pointeurs sur
des objets.



C'est ce que je fais aussi mais j'avais peur d'être passé à côté d'un truc
énorme ! Il semble que ce ne soit pas le cas, ça me rassure :-)

Avatar
Loïc Joly
Zouplaz wrote:
Ha ! Quand même ! C'est ce que je croyais avoir compris mais hier encore
je lisais un ebook disant "pointeur = pas bon-caca-beurk-moche, on peut
s'en passer TOTALEMENT" et franchement j'ai beau tourner le problème dans
tous les sens je vois pas comment !

Donc, définitivement les pointeurs sont utiles et il y a des cas
(fréquents on dirait) pour lesquels on est bien obligés de s'en servir
!?!?


Je dirais pour ma part :

Pointeur = danger, donc éviter de l'utiliser si possible.

Les alternatives sont :
- Utiliser directement les objets (j'ai l'impression que les gens venant
du Java oublient souvent cette possibilité)
- Utiliser des références
- Utiliser des pointeurs intelligents, lettre/enveloppe, std::vector...
c'est à dire toute classe qui va encapsuler les pointeurs dans un truc
plus simple d'emploi

--
Loïc

Avatar
Jean-Marc Molina
Moi j'utilise std::auto_ptr ou les smart pointers de la librairie boost
(boost::shared_ptr & cie).
Par contre c'est bien de s'amuser un peu avec les pointeurs du C pour
comprendre leur fonctionnement.

JM

--
Clé AntiPourriel : PASUNPOURRIEL (ne pas retirer)
Avatar
kanze
Loïc Joly wrote in message
news:<bo3bj1$b71$...
Zouplaz wrote:
Ha ! Quand même ! C'est ce que je croyais avoir compris mais hier
encore je lisais un ebook disant "pointeur = pas
bon-caca-beurk-moche, on peut s'en passer TOTALEMENT" et franchement
j'ai beau tourner le problème dans tous les sens je vois pas comment
!

Donc, définitivement les pointeurs sont utiles et il y a des cas
(fréquents on dirait) pour lesquels on est bien obligés de s'en
servir !?!?


Je dirais pour ma part :

Pointeur = danger, donc éviter de l'utiliser si possible.

Les alternatives sont :
- Utiliser directement les objets (j'ai l'impression que les gens venant
du Java oublient souvent cette possibilité)
- Utiliser des références
- Utiliser des pointeurs intelligents, lettre/enveloppe, std::vector...
c'est à dire toute classe qui va encapsuler les pointeurs dans un truc
plus simple d'emploi


Tout dépend de ce que tu fais. Tu ne te serviras certainement pas des
pointeurs intelligents à l'intérieur d'une classe de liste, par exemple,
ni probablement dans une implémentation des graphes. Même dans les
applications plus classiques, ils comportent aussi leurs risques : les
cycles ne sont pas toujours évidents, par exemple.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16


Avatar
Fabien LE LEZ
On 4 Nov 2003 09:46:12 -0800, wrote:

Tu ne te serviras certainement pas des
pointeurs intelligents à l'intérieur d'une classe de liste, par exemple,


Je suis dubitatif quant au "certainement". Par contre, si une classe
de liste se sert d'une classe "pointeur intelligent", il y a fort à
parier que ce soit une classe faite sur mesure pour la classe "liste".

--
;-)

Avatar
Christophe Lephay
Fabien LE LEZ wrote:
On 4 Nov 2003 09:46:12 -0800, wrote:
Tu ne te serviras certainement pas des
pointeurs intelligents à l'intérieur d'une classe de liste, par
exemple,


Je suis dubitatif quant au "certainement". Par contre, si une classe
de liste se sert d'une classe "pointeur intelligent", il y a fort à
parier que ce soit une classe faite sur mesure pour la classe "liste".


James parlait surement de listes chainées, ce que tu te serais aussi dit si
tu ne trainais pas sur les newsgroups à des heures indues !

Par contre, peut-être que je me serais dit que c'est ce que tu t'étais dit
si, moi-même, je n'y trainais pas à ces mêmes heures ;)

Chris


1 2