OVH Cloud OVH Cloud

STL - conteneurs : pointeurs et references

11 réponses
Avatar
Jeremie Fouche
Bonjour a tous

Bon, je souhaiterai mettre au clair la difference en terme de conception
entre l'utilisation de pointeurs et l'utilisation de references. J'utilise
personnellement la regle suivante : j'utilise toujours des references, sauf
dans les cas ou il n'y a pas forcement d'objet lors d'une recherche. Je sens
qu'il faut que je m'explique.

prenons l'exemple suivant :
Un logiciel musical :
- Plusieurs canaux d'instruments.
- Chaque canal peut contenir plusieurs notes.

class Note;
class clefNote;
class lessClefNote : public std::binary_function<const clefNote&, const
clefNote&>;

class Canal
{
...
protected:
std::map<clefNote,Note,lessClefNote> m_mapNotes;

public:
const Note* GetNote(int position, int hauteur) const;
};

class Song
{
...
protected:
std::vector<Canal> m_vectCanaux;

public:
const Canal& GetCanal(int nCanal) const;
}

La regle que je souhaite utiliser est elle adaptée ? Et peut on l'appliquer
tout le temps ?
Je souhaiterai de plus comprendre pourquoi le code suivant ne compile pas
Question deja posee le 16/08 mais sans réponse ).

#include <list>

class A
{
public:
A() {}
~A() {}

public:
int m_i;
};

typedef list<A&> listRefA;
typedef listRefA::iterator iterListRefA;

Le message d'erreur m'indique que la definition du type iterListRefA est
interdite. C'est a dire, si j'ai bien regardé le source de <list> que la
definition du type A&* est interdite. Pourtant, la definition d'une liste de
reference sur un objet est authorisée. Quelques explications ?

Merci pour tout

--
Jérémie Fouché

1 réponse

1 2
Avatar
Jean-Marc Bourguet
writes:

Jean-Marc Bourguet wrote in message
news:...
"Jeremie Fouche" writes:


[...]

Ma regle a moi est differente: j'utilise des pointeurs sauf que je ne
veux pas devoir utiliser l'operateur &. Quand une interface force a
prendre regulierement l'adresse de variables locales ou de resultats
de fonctions, je trouve qu'il y a un probleme.


[ On n'a parfois pas le choix ]


Dans les autres cas, la différence est largement une question de
convention. Dans les boîtes où j'ai travaillé, j'ai vu deux grandes
conventions en ce qui concerne les paramètres :

- on utilise systèmatiquement, sauf si le client a le droit de passer
un pointeur nul, et

- on utilise un pointeur chaque fois que la fonction exige que l'objet
vie au delà de l'appel de la fonction, c-à-d par exemple, qu'elle
stocke le pointeur dans l'objet, ou que la fonction joue sur la
durée de vie de l'objet -- par exemple, si la fonction fait un
delete sur le paramètre, on passe un pointeur, et non une référence.

J'ai une faible préférence actuellement pour le premier, mais
l'importance, c'est d'en choisir un et être cohérent.

Pour les valeurs de rétour, on a à peu près les deux mêmes altérnatifs :

- on renvoie une référence, sauf si on veut retenir la possibilité de
renvoyer un pointeur nul, par exemple en cas d'échec, et

- on renvoie un pointeur aussi quand il y a transfer de la
responsibilité pour la durée de vie, c-à-d quand c'est celui qui
reçoit le pointeur qui doit faire un delete.

Ici, je constate que « delete &r » sur une référence r semble dérouter
pas mal de programmeurs ; j'ai donc prèsque toujours vu la seconde
option dans les règles de codage.


Ta deuxieme alternative correspond en gros a ma regle mais
- ta formulation est centree sur la fonction, la mienne sur les
utilisations faites du type
- je vais utiliser des pointeurs dans le cas d'objets jamais
instancies sur la pile tandis que cette regle va utiliser parfois
des pointeurs parfois des references suivants ce que fait la
fonction; il est des classes dont je ne vois que des pointeurs,
jamais de references ou de variables locales et ca me semble plus
coherent).

En dehors des paramètres et les valeurs de rétour, je n'utilise prèsque
jamais de références.


Moi non plus

[ Il y a des usages idiomatiques qui ne suivent pas les regles ]

Eh oui, ce serait trop simple.

A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


1 2