OVH Cloud OVH Cloud

Vecteur de références

19 réponses
Avatar
Dominique MICOLLET
Bonjour,

Je précise que je débute plus ou moins en C++, en venant du C.

J'essaye la chose suivante (:

class A {...}

class B:public A {...};

class C:public A {...};

....
vector<A&> truc ;
....

dans le but de faire du polymorphisme avec des choses du genre :
truc.push_pack(B);
truc.push_pack(C);

À la compilation je récupère, sur la déclaration du vector :
error: forming pointer to reference type `A&'


Est à dire qu'on ne peut pas faire de vecteur de références ?
Si c'est le cas, je ne comprends pas bien pourquoi.

PS: j'ai contourné le problème avec un vector<A*>, mais je trouve les
références plus "sympathiques".



Cordialement
--
Dominique MICOLLET Email : enlever deux fr
Universite de Bourgogne
9, Avenue Alain SAVARY BP 47870 Tel : +33/(0)3-80-39-59-27
21078 DIJON CEDEX FRANCE Tfx : +33/(0)3-80-39-68-69

10 réponses

1 2
Avatar
Fabien LE LEZ
On Tue, 16 Jan 2007 08:21:06 +0100, Dominique MICOLLET :

Subject: Vecteur de références


Attention, un vecteur est un objet mathématique n'ayant pas
grand-chose à voir avec std::vector<>.

vector<A&> truc ;


Pour mettre un objet dans une collection STL (vector, list, etc.), il
faut que cet objet soit copiable.

Tu peux créer une collection de pointeurs, car un pointeur est un
objet à part entière.

Une référence est grosso modo un pointeur qui pointe toujours sur la
même variable. Ce n'est pas un objet en soi, et on ne peut pas
l'assigner.

Avatar
Loïc Joly

Est à dire qu'on ne peut pas faire de vecteur de références ?
Si c'est le cas, je ne comprends pas bien pourquoi.


Effectivement. Les éléments à l'intérieur d'un vector doivent répondre à
certains critères, dont celui d'être assignable. C'est à dire qu'on doit
pouvoir écrire :
T t1;
T t2;
t2 = t1;

Et on ne peut pas faire ça si T est un type référence.

--
Loïc

Avatar
James Kanze
Fabien LE LEZ wrote:
On Tue, 16 Jan 2007 08:21:06 +0100, Dominique MICOLLET :


[...]
vector<A&> truc ;


Pour mettre un objet dans une collection STL (vector, list, etc.), il
faut que cet objet soit copiable.


Et qu'il soit affectable. Une référence peut être copiée, mais
l'affectation ne touche pas la référence, mais le référencé.

Tu peux créer une collection de pointeurs, car un pointeur est un
objet à part entière.

Une référence est grosso modo un pointeur qui pointe toujours sur la
même variable. Ce n'est pas un objet en soi, et on ne peut pas
l'assigner.


Puisque tu lui a corrigé l'utilisation du mot vecteur, je me
permettrai de signaler qu'en français, le mot est
« affecter », et non « assigner ».

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
James Kanze
Loïc Joly wrote:

Est à dire qu'on ne peut pas faire de vecteur de références ?
Si c'est le cas, je ne comprends pas bien pourquoi.


Effectivement. Les éléments à l'intérieur d'un vector doivent r épondre à
certains critères, dont celui d'être assignable. C'est à dire qu'on doit
pouvoir écrire :
T t1;
T t2;
t2 = t1;

Et on ne peut pas faire ça si T est un type référence.


Bien sûr que si. Seulement, la sémantique n'en convient pas.
(Disons que la véritable problème, c'est que la sémantique de
copie est radicalement différente que la sémantique de
l'affectation.)

Il y a aussi le petit détail que les fonctions de std::vector
prend leurs paramètres de type T par référence, et qu'on ne peut
pas avoir une référence à une référence.

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Dominique MICOLLET
Dominique MICOLLET wrote:

Est à dire qu'on ne peut pas faire de vecteur de références ?


OK

Merci pour vos explications.

Je vais donc en rester à mon vecteur de pointeurs. Snif :-(

Incidemment comment traduisez-vous vector dans ce contexte ?

--
Cordialement

Dominique MICOLLET Email : enlever deux fr
Universite de Bourgogne
9, Avenue Alain SAVARY BP 47870 Tel : +33/(0)3-80-39-59-27
21078 DIJON CEDEX FRANCE Tfx : +33/(0)3-80-39-68-69

Avatar
Fabien LE LEZ
On Tue, 16 Jan 2007 10:51:17 +0100, Dominique MICOLLET :

Je vais donc en rester à mon vecteur de pointeurs. Snif :-(


Note qu'on se retrouve rarement avec un vector<> nu "dans la nature".
Bien souvent, on l'encapsule dans une classe, qui offre une interface
correspondant mieux aux besoins.

Rien ne t'empêche alors d'utiliser des références dans l'interface, et
des pointeurs dans la cuisine interne de la classe.


Incidemment comment traduisez-vous vector dans ce contexte ?


Perso, je suis contre la traduction. J'appelle "vector" un objet
déclaré par "std::vector<..." ; j'appelle "template" une construction
introduite par le mot-clé "template", etc.

Mais c'est peut-être un travers qui vient du fait que je n'ai jamais
appris la programmation objet en-dehors du C++. C'est aussi pour ça
que je n'emploie jamais le mot "méthode" (sauf bien sûr pour désigner
un moyen d'obtenir un résultat donné).

Avatar
AlexSoft
bonjour dominique,

Je vais donc en rester à mon vecteur de pointeurs. Snif :-(


dans ton cas (tableau d'un type polymorphe) si tu veux les références, je
suppose que c'est pour éviter les pbs de libération mémoire, de copie
multiple, etc... Alors un pointeur intelligent me semble très efficace, s'il
est bien écrit (je crois que boost::shared_ptr convient ici, moi je ne m'en
sers pas j'utilise le mien), il est copiable et donc utilisable par
std::vector (ainsi que les autres conteneurs...) mais utilisant en interne
un "vrai" pointeur, et surchargeant l'opérateur ->, on peut l'utiliser
"comme" un pointeur.


Incidemment comment traduisez-vous vector dans ce contexte ?
moi, par "tableau", puisque c'est l'utilisation que j'en fait.



--
Cordialement

Dominique MICOLLET Email : enlever deux fr
Universite de Bourgogne
9, Avenue Alain SAVARY BP 47870 Tel : +33/(0)3-80-39-59-27


cordialement itou
Alexandre Guidet
IUT de DIJON

Avatar
Dominique MICOLLET
AlexSoft wrote:

bonjour dominique,

Je vais donc en rester à mon vecteur de pointeurs. Snif :-(


dans ton cas (tableau d'un type polymorphe) si tu veux les références, je
suppose que c'est pour éviter les pbs de libération mémoire, de copie
multiple, etc...


Oui :-)

Je n'aime pas programmer comme un cochon...

Alors un pointeur intelligent me semble très efficace,
Il faut que je regarde cela.


Pour le moment, je nettoie correctement les pointeurs dans le destructeur.

--
Cordialement

Dominique MICOLLET Email : enlever deux fr
Universite de Bourgogne
9, Avenue Alain SAVARY BP 47870 Tel : +33/(0)3-80-39-59-27
21078 DIJON CEDEX FRANCE Tfx : +33/(0)3-80-39-68-69


Avatar
Fabien LE LEZ
On Wed, 17 Jan 2007 16:48:54 +0100, Dominique MICOLLET :

Pour le moment, je nettoie correctement les pointeurs dans le destructeur.


Si c'est là le problème, je ne vois pas bien quel avantage tu comptais
obtenir de l'usage de références.

Au fait, es-tu sûr de ne pas pouvoir mettre carrément les objets dans
ton vector ? Quitte à le transformer en list si ça s'avère nécessaire.

Avatar
AlexSoft
Si c'est là le problème, je ne vois pas bien quel avantage tu comptais
obtenir de l'usage de références.


Au fait, es-tu sûr de ne pas pouvoir mettre carrément les objets dans
ton vector ? Quitte à le transformer en list si ça s'avère nécessaire.



je pense qu'il doit avoir des objets polymorphes, donc à manipuler via des
pointeurs (ou des références ;-))

1 2