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
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
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
Fabien LE LEZ
On Thu, 18 Jan 2007 14:56:56 +0100, Dominique MICOLLET :
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...
On Thu, 18 Jan 2007 14:56:56 +0100, Dominique MICOLLET :
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...
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...
Fabien LE LEZ
On Thu, 18 Jan 2007 14:56:56 +0100, Dominique MICOLLET :
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é.
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
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
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
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).
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).
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).
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
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:james.kanze@gmail.com
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
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
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.
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.
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.
espie
In article , Fabien LE LEZ wrote:
On Thu, 18 Jan 2007 14:56:56 +0100, Dominique MICOLLET :
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...
In article <ho2vq2ta9l3cambhagkf4gcf8kp8u3mgdo@4ax.com>,
Fabien LE LEZ <usenet11@edulang.com> wrote:
On Thu, 18 Jan 2007 14:56:56 +0100, Dominique MICOLLET :
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...
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...
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.
On Thu, 18 Jan 2007 23:05:20 +0000 (UTC), espie@lain.home (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.