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

9 réponses

1 2
Avatar
Dominique MICOLLET
Fabien LE LEZ wrote:

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


Euhhhhhh..... Le bon usage des références est encore un peu confus pour moi.
Il faut que je réfléchisse un peu plus :-)
J'ai aussi des soucis avec les objets en retour d'une méthode, du genre :
string truc()
{
string Resultat="Hello";
....
return Resultat;
}

Resultat est dans la pile donc disparait à la fin de l'exécution de la
méthode. Donc Resultat doit être recopié, et je ne suis pas sur de
l'endroit ou il l'est, et de la pérennité de l'information


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.


J'ai besoin de polymorphisme.


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 Thu, 18 Jan 2007 14:56:56 +0100, Dominique MICOLLET :

string truc()
{
string Resultat="Hello";
....
return Resultat;
}

Resultat est dans la pile donc disparait à la fin de l'exécution de la
méthode.


Attention avec le mot "méthode". Son sens est loin d'être univoque :
pour certains, il signifie "fonction membre" ; pour d'autre, il
signifie "fonction membre virtuelle". Comme certains langages n'ont
pas de fonctions membres non virtuelles, ça complique encore
l'affaire.

Franchement, au moins dans le cadre du C++, je conseille l'usage de
l'expression "fonction membre", ce qui évite l'équivoque.

De toutes façons, ici, il s'agit d'une fonction libre, non membre
d'une classe...

Avatar
Fabien LE LEZ
On Thu, 18 Jan 2007 14:56:56 +0100, Dominique MICOLLET :

string truc()
{
string Resultat="Hello";
....
return Resultat;
}

Resultat est dans la pile donc disparait à la fin de l'exécution de la
méthode.


Un nouvel objet de classe string est créé, et c'est lui qui est
renvoyé à l'appelant.

Un exemple encore plus frappant :

string f()
{
char buf[42];
...
return buf;
}

Idem, un objet de classe string est créé avant que "buf" soit détruit,
et c'est ce "string" qui est renvoyé.

Avatar
Dominique MICOLLET
Fabien LE LEZ wrote:
Un nouvel objet de classe string est créé, et c'est lui qui est
renvoyé à l'appelant.
....

Idem, un objet de classe string est créé avant que "buf" soit détruit,
et c'est ce "string" qui est renvoyé.
Certes, mais où se trouve-t'il ? Tas ou pile ?

Et combien de temps existe-t'il ?
Tout ça n'est pas clair pour moi.

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 Thu, 18 Jan 2007 16:23:43 +0100, Dominique MICOLLET :

Idem, un objet de classe string est créé avant que "buf" soit détruit,
et c'est ce "string" qui est renvoyé.
Certes, mais où se trouve-t-il ? Tas ou pile ?



Je ne sais pas trop. A priori, l'objet en lui-même doit se trouver sur
la pile, où l'appelant sait le récupérer.
M'enfin bon, c'est la cuisine interne du compilo, pas le problème du
programmeur (en général).

Et combien de temps existe-t-il ?


Dans le contexte de l'appelant, c'est un objet temporaire.

string f();

string x= f() + string("hello");

Je peux me tromper sur les détails, mais il me semble que l'objet
retourné par f(), ainsi que l'objet créé par string("hello"), sont
tous les deux des objets temporaires, détruits à la fin de
l'expression (i.e. au point-virgule).


Avatar
James Kanze
Fabien LE LEZ wrote:
On Thu, 18 Jan 2007 16:23:43 +0100, Dominique MICOLLET :

Idem, un objet de classe string est créé avant que "buf" soit dé truit,
et c'est ce "string" qui est renvoyé.
Certes, mais où se trouve-t-il ? Tas ou pile ?



Je ne sais pas trop. A priori, l'objet en lui-même doit se trouver sur
la pile, où l'appelant sait le récupérer.
M'enfin bon, c'est la cuisine interne du compilo, pas le problème du
programmeur (en général).


En effet. À titre indicatif, certains compilateurs passent un
pointeur supplémentaire à la fonction, avec l'adresse où elle
doit construire la valeur de retour.

Et combien de temps existe-t-il ?


Dans le contexte de l'appelant, c'est un objet temporaire.


Qui est détruit à la fin de l'expression complète qui contient
l'appel à la fonction.

string f();

string x= f() + string("hello");

Je peux me tromper sur les détails, mais il me semble que l'objet
retourné par f(), ainsi que l'objet créé par string("hello"), sont
tous les deux des objets temporaires, détruits à la fin de
l'expression (i.e. au point-virgule).


Tout à fait.

--
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
Alexandre
Idem, un objet de classe string est créé avant que "buf" soit détruit,
et c'est ce "string" qui est renvoyé.
Certes, mais où se trouve-t'il ? Tas ou pile ?

Et combien de temps existe-t'il ?
Tout ça n'est pas clair pour moi.


L'instance de string est sur la pile, et elle contient un pointeur sur des
données sur le tas...
Enfin sans optimisation du compilo, bien sur. Ce qui n'est pas forcément
évident.
De toutes façons, ça n'a pas d'importance ici. string est un objet avec une
sémantique de valeur, copiable, donc en gros comme un int. Aucun souci pour
le retour donc.


Avatar
espie
In article ,
Fabien LE LEZ wrote:
On Thu, 18 Jan 2007 14:56:56 +0100, Dominique MICOLLET :

string truc()
{
string Resultat="Hello";
....
return Resultat;
}

Resultat est dans la pile donc disparait à la fin de l'exécution de la
méthode.


Un nouvel objet de classe string est créé, et c'est lui qui est
renvoyé à l'appelant.



Pas forcement ! c'est la fameuse `return copy optimisation' qui entre
en jeu, et elle est encore juste une suggestion forte. D'ailleurs,
si on veut comprendre ce qui se passe, il faut aussi l'utilisation
du code.

Si j'ecris:
string a = truc();

je vais avoir combien d'objets crees / copies / affectes et comment ?

Si je me souviens bien, le compilo a le droit d'a peu pres tout optimiser
en l'occurrence, et de creer directement le resultat dans a, ou presque...


Avatar
Fabien LE LEZ
On Thu, 18 Jan 2007 23:05:20 +0000 (UTC), (Marc
Espie):

Si j'ecris:
string a = truc();

je vais avoir combien d'objets crees / copies / affectes et comment ?


L'idée est que si tu as besoin de connaître cette information (hors
problème d'optimisation), ton code est mal fait.

1 2