Marc Boyer wrote:Marc Boyer writes:
[...]
Mais j'ai peut etre identifié le pb. Quand j'écris un truc du gen re
X x( Y(1) );
avec X et Y deux classes, quelle est la durée de vie de l'objet
temporaire Y ?
Comme tous les temporaires qui ne sont pas bindé a une variable refe rence:
jusqu'a la fin de l'expression.
Oui, et ici, l'expression termine à la fin du constructeur de x( );
Actuellement, je prends une référence sur cet objet,
Si tu la conserve au dela du constructeur de x (comme le laisse croire la
suite), c'est fort possible que ce soit la source de ton probleme (et on ne
se retrouve pas dans le cas general mais vraissemblablement tu appelle s le
membre virtuel apres la fin de l'execution du destructeur de Y(1)).
Oui, c'est ça. Ce qui est déstabilisant, c'est que ça fait part ie
des trucs qui arrivent 'parfois'. En fait, j'avais fait un exemple
minimal à poster ici, et sur l'exemple, ça plante pas.
Probablement parce que ton compilateur ne detruit les temporaires qu'a
la fin du bloc main.
Marc Boyer wrote:
Marc Boyer <Marc.Bo...@enseeiht.yahoo.fr.invalid> writes:
[...]
Mais j'ai peut etre identifié le pb. Quand j'écris un truc du gen re
X x( Y(1) );
avec X et Y deux classes, quelle est la durée de vie de l'objet
temporaire Y ?
Comme tous les temporaires qui ne sont pas bindé a une variable refe rence:
jusqu'a la fin de l'expression.
Oui, et ici, l'expression termine à la fin du constructeur de x( );
Actuellement, je prends une référence sur cet objet,
Si tu la conserve au dela du constructeur de x (comme le laisse croire la
suite), c'est fort possible que ce soit la source de ton probleme (et on ne
se retrouve pas dans le cas general mais vraissemblablement tu appelle s le
membre virtuel apres la fin de l'execution du destructeur de Y(1)).
Oui, c'est ça. Ce qui est déstabilisant, c'est que ça fait part ie
des trucs qui arrivent 'parfois'. En fait, j'avais fait un exemple
minimal à poster ici, et sur l'exemple, ça plante pas.
Probablement parce que ton compilateur ne detruit les temporaires qu'a
la fin du bloc main.
Marc Boyer wrote:Marc Boyer writes:
[...]
Mais j'ai peut etre identifié le pb. Quand j'écris un truc du gen re
X x( Y(1) );
avec X et Y deux classes, quelle est la durée de vie de l'objet
temporaire Y ?
Comme tous les temporaires qui ne sont pas bindé a une variable refe rence:
jusqu'a la fin de l'expression.
Oui, et ici, l'expression termine à la fin du constructeur de x( );
Actuellement, je prends une référence sur cet objet,
Si tu la conserve au dela du constructeur de x (comme le laisse croire la
suite), c'est fort possible que ce soit la source de ton probleme (et on ne
se retrouve pas dans le cas general mais vraissemblablement tu appelle s le
membre virtuel apres la fin de l'execution du destructeur de Y(1)).
Oui, c'est ça. Ce qui est déstabilisant, c'est que ça fait part ie
des trucs qui arrivent 'parfois'. En fait, j'avais fait un exemple
minimal à poster ici, et sur l'exemple, ça plante pas.
Probablement parce que ton compilateur ne detruit les temporaires qu'a
la fin du bloc main.
OUi, mais c'est toujours Fonction::() qui est appelé.
Mais il marche très bien actuellement ;-)
Il est laid, mais il marche.
Bon, je n'arrive plus à avoir les deux comportements différents :-(
Ca plante dans tous les cas. C'est plutot normal.
OUi, mais c'est toujours Fonction::() qui est appelé.
Mais il marche très bien actuellement ;-)
Il est laid, mais il marche.
Bon, je n'arrive plus à avoir les deux comportements différents :-(
Ca plante dans tous les cas. C'est plutot normal.
OUi, mais c'est toujours Fonction::() qui est appelé.
Mais il marche très bien actuellement ;-)
Il est laid, mais il marche.
Bon, je n'arrive plus à avoir les deux comportements différents :-(
Ca plante dans tous les cas. C'est plutot normal.
Marc Boyer writes:Marc Boyer writes:Si le véritable exemple t'intéresse, je peux te le poster.
Ca n'est pas très long (7 classes, 400 lignes, 10ko de code).
Tu peux le faire ou me l'envoyer en perso. Je ne garanti pas de repo nse
rapide.
Levons une ambiguïté: en ce qui me concerne, l'explication sur
la gestion des temporaires me convient, en j'ai une solution à
base de *(new X(1)), qui crée des objets persistants.
Après, Laurent était étonné par la nature du message d'erreur et
je lui proposais le code s'il le voulait. Cela vaut aussi pour
toi.
Mais ne fait pas ça pour moi, mais uniquement pour satisfaire ta
curiosité.
J'aimerais bien comprendre pourquoi ton exemple reduit ne donne pas le
message que tu as avec le code complet...
Et ce avec au moins 2
compilateurs d'origine differentes meme en non optimise, donc il y a peut
de chance que ce soit un artefact d'un compilateur qui applique une
optimisation tenant compte du fait que tout est visible.
Marc Boyer <Marc.Bo...@enseeiht.yahoo.fr.invalid> writes:
Marc Boyer <Marc.Bo...@enseeiht.yahoo.fr.invalid> writes:
Si le véritable exemple t'intéresse, je peux te le poster.
Ca n'est pas très long (7 classes, 400 lignes, 10ko de code).
Tu peux le faire ou me l'envoyer en perso. Je ne garanti pas de repo nse
rapide.
Levons une ambiguïté: en ce qui me concerne, l'explication sur
la gestion des temporaires me convient, en j'ai une solution à
base de *(new X(1)), qui crée des objets persistants.
Après, Laurent était étonné par la nature du message d'erreur et
je lui proposais le code s'il le voulait. Cela vaut aussi pour
toi.
Mais ne fait pas ça pour moi, mais uniquement pour satisfaire ta
curiosité.
J'aimerais bien comprendre pourquoi ton exemple reduit ne donne pas le
message que tu as avec le code complet...
Et ce avec au moins 2
compilateurs d'origine differentes meme en non optimise, donc il y a peut
de chance que ce soit un artefact d'un compilateur qui applique une
optimisation tenant compte du fait que tout est visible.
Marc Boyer writes:Marc Boyer writes:Si le véritable exemple t'intéresse, je peux te le poster.
Ca n'est pas très long (7 classes, 400 lignes, 10ko de code).
Tu peux le faire ou me l'envoyer en perso. Je ne garanti pas de repo nse
rapide.
Levons une ambiguïté: en ce qui me concerne, l'explication sur
la gestion des temporaires me convient, en j'ai une solution à
base de *(new X(1)), qui crée des objets persistants.
Après, Laurent était étonné par la nature du message d'erreur et
je lui proposais le code s'il le voulait. Cela vaut aussi pour
toi.
Mais ne fait pas ça pour moi, mais uniquement pour satisfaire ta
curiosité.
J'aimerais bien comprendre pourquoi ton exemple reduit ne donne pas le
message que tu as avec le code complet...
Et ce avec au moins 2
compilateurs d'origine differentes meme en non optimise, donc il y a peut
de chance que ce soit un artefact d'un compilateur qui applique une
optimisation tenant compte du fait que tout est visible.
Marc Boyer wrote on 07/03/2007 16:08:OUi, mais c'est toujours Fonction::() qui est appelé.
pour une instance de Fonction oui, pour une instance (effective, pas
détruite) de Affine, non.
Marc Boyer wrote on 07/03/2007 16:23:Bon, je n'arrive plus à avoir les deux comportements différents :-(
Ca plante dans tous les cas. C'est plutot normal.
si tu t'attends à ce qu'il "plante" alors en effet il "marche"
mais il va bien tôt falloir préciser les termes.
Marc Boyer wrote on 07/03/2007 16:08:
OUi, mais c'est toujours Fonction::() qui est appelé.
pour une instance de Fonction oui, pour une instance (effective, pas
détruite) de Affine, non.
Marc Boyer wrote on 07/03/2007 16:23:
Bon, je n'arrive plus à avoir les deux comportements différents :-(
Ca plante dans tous les cas. C'est plutot normal.
si tu t'attends à ce qu'il "plante" alors en effet il "marche"
mais il va bien tôt falloir préciser les termes.
Marc Boyer wrote on 07/03/2007 16:08:OUi, mais c'est toujours Fonction::() qui est appelé.
pour une instance de Fonction oui, pour une instance (effective, pas
détruite) de Affine, non.
Marc Boyer wrote on 07/03/2007 16:23:Bon, je n'arrive plus à avoir les deux comportements différents :-(
Ca plante dans tous les cas. C'est plutot normal.
si tu t'attends à ce qu'il "plante" alors en effet il "marche"
mais il va bien tôt falloir préciser les termes.
Alors je pourrais sortir l'artillerie des pointeurs, ou de methode
..clone(), mais j'ai la flemme. C'est du code jetable.
des données membre pointeurs sont pourtant la bonne solution, leur
initialisation, utilisation peut selon le nombre d'occurrence être
doublonné avec des refs pour s'épargner qlq déréférencements.
Dans de tels cas, ça m'arrive souvent de faire que le paramètre
et la variable membre sont des std::auto_ptr. Quand je fais
vite, et que je n'ai pas le collecteur de Boehm sous la main,
évidemment. Si j'ai Boost installé, je pourrais aussi préférer
boost::shared_ptr dans ce cas précis. (Ce n'est pas une réponse
universelle à l'absence du GC, mais dans le cas des agents
polymorphe, il est tout à fait indiqué.)
Alors je pourrais sortir l'artillerie des pointeurs, ou de methode
..clone(), mais j'ai la flemme. C'est du code jetable.
des données membre pointeurs sont pourtant la bonne solution, leur
initialisation, utilisation peut selon le nombre d'occurrence être
doublonné avec des refs pour s'épargner qlq déréférencements.
Dans de tels cas, ça m'arrive souvent de faire que le paramètre
et la variable membre sont des std::auto_ptr. Quand je fais
vite, et que je n'ai pas le collecteur de Boehm sous la main,
évidemment. Si j'ai Boost installé, je pourrais aussi préférer
boost::shared_ptr dans ce cas précis. (Ce n'est pas une réponse
universelle à l'absence du GC, mais dans le cas des agents
polymorphe, il est tout à fait indiqué.)
Alors je pourrais sortir l'artillerie des pointeurs, ou de methode
..clone(), mais j'ai la flemme. C'est du code jetable.
des données membre pointeurs sont pourtant la bonne solution, leur
initialisation, utilisation peut selon le nombre d'occurrence être
doublonné avec des refs pour s'épargner qlq déréférencements.
Dans de tels cas, ça m'arrive souvent de faire que le paramètre
et la variable membre sont des std::auto_ptr. Quand je fais
vite, et que je n'ai pas le collecteur de Boehm sous la main,
évidemment. Si j'ai Boost installé, je pourrais aussi préférer
boost::shared_ptr dans ce cas précis. (Ce n'est pas une réponse
universelle à l'absence du GC, mais dans le cas des agents
polymorphe, il est tout à fait indiqué.)
Marc Boyer wrote on 07/03/2007 13:42:class Min : public Fonction {
const Fonction& f;
const Fonction& g;
Probleme ici. Il ne faut pas utiliser des references mais des copies.
des copies locales ou des références à des non-temporaires.Avec des copies
const Fonction f;
je perds le polymorphisme (et sur ce coup, il se plaint que Fonction
a une méthode virtuelle pure).
le polymorphisme existe toujours mais en effet 'Fonction' est
virtuel pure.
Alors je pourrais sortir l'artillerie des pointeurs, ou de methode
..clone(), mais j'ai la flemme. C'est du code jetable.
des données membre pointeurs sont pourtant la bonne solution, leur
initialisation, utilisation peut selon le nombre d'occurrence être
doublonné avec des refs pour s'épargner qlq déréférencements.
int main(){
Min m( Affine(2), Affine(3) );
assert( m(1)== 2 );
Min m2( Min(Affine(2), Affine(3)), Affine(4) );
assert( m(1)== 2 );
}
En revanche, je ne vois pas le rapport avec 'pure virtual call' dans c et
exemple.
à la sortie du constructeur de 'm' les tempos Affine(2) et (3) sont
détruits et le destructeur peut (doit?) réduire sa table de résolut ion
virtuelle au type de base,
m.f et m.g existent toujours et contiennent
les ghosts de ces classes lors de l'appel à m(1), la résolution
virtuelle de () appliquée à f et g tombe alors sur la définition de
Fonction () qui est bien virtuelle pure.
Marc Boyer wrote on 07/03/2007 13:42:
class Min : public Fonction {
const Fonction& f;
const Fonction& g;
Probleme ici. Il ne faut pas utiliser des references mais des copies.
des copies locales ou des références à des non-temporaires.
Avec des copies
const Fonction f;
je perds le polymorphisme (et sur ce coup, il se plaint que Fonction
a une méthode virtuelle pure).
le polymorphisme existe toujours mais en effet 'Fonction' est
virtuel pure.
Alors je pourrais sortir l'artillerie des pointeurs, ou de methode
..clone(), mais j'ai la flemme. C'est du code jetable.
des données membre pointeurs sont pourtant la bonne solution, leur
initialisation, utilisation peut selon le nombre d'occurrence être
doublonné avec des refs pour s'épargner qlq déréférencements.
int main(){
Min m( Affine(2), Affine(3) );
assert( m(1)== 2 );
Min m2( Min(Affine(2), Affine(3)), Affine(4) );
assert( m(1)== 2 );
}
En revanche, je ne vois pas le rapport avec 'pure virtual call' dans c et
exemple.
à la sortie du constructeur de 'm' les tempos Affine(2) et (3) sont
détruits et le destructeur peut (doit?) réduire sa table de résolut ion
virtuelle au type de base,
m.f et m.g existent toujours et contiennent
les ghosts de ces classes lors de l'appel à m(1), la résolution
virtuelle de () appliquée à f et g tombe alors sur la définition de
Fonction () qui est bien virtuelle pure.
Marc Boyer wrote on 07/03/2007 13:42:class Min : public Fonction {
const Fonction& f;
const Fonction& g;
Probleme ici. Il ne faut pas utiliser des references mais des copies.
des copies locales ou des références à des non-temporaires.Avec des copies
const Fonction f;
je perds le polymorphisme (et sur ce coup, il se plaint que Fonction
a une méthode virtuelle pure).
le polymorphisme existe toujours mais en effet 'Fonction' est
virtuel pure.
Alors je pourrais sortir l'artillerie des pointeurs, ou de methode
..clone(), mais j'ai la flemme. C'est du code jetable.
des données membre pointeurs sont pourtant la bonne solution, leur
initialisation, utilisation peut selon le nombre d'occurrence être
doublonné avec des refs pour s'épargner qlq déréférencements.
int main(){
Min m( Affine(2), Affine(3) );
assert( m(1)== 2 );
Min m2( Min(Affine(2), Affine(3)), Affine(4) );
assert( m(1)== 2 );
}
En revanche, je ne vois pas le rapport avec 'pure virtual call' dans c et
exemple.
à la sortie du constructeur de 'm' les tempos Affine(2) et (3) sont
détruits et le destructeur peut (doit?) réduire sa table de résolut ion
virtuelle au type de base,
m.f et m.g existent toujours et contiennent
les ghosts de ces classes lors de l'appel à m(1), la résolution
virtuelle de () appliquée à f et g tombe alors sur la définition de
Fonction () qui est bien virtuelle pure.
Reprenons
class Min : public Fonction {
const Fonction f;
const Fonction g;
// J'utilise des valeurs, et non des références, puisque c'est le
// point de débat (cf
// )
class Min : public Fonction {
const Fonction& f;
const Fonction& g;
% ./fclcpp
fclcpp: fclcpp.cpp:5: virtual double Fonction::operator()(double) const:
Assertion `false' failed.
-------------------------- ECM -----------------------------------------
Donc, c'est bien Fonction:() qui est appelé et pas Affine,
même si je remplace
Min m( Affine(2), Affine(3) );
par
Min m( *new Affine(2), *new Affine(3) );
J'ai peut-être manqué de clarté.
Il plante quand je lui passe des temporaires en paramètre, dans
l'exemple complet et l'exemple minimal. Ce qui me semble normal.
Après, quand je l'appelle avec des non temporaires, genre
Affine a1(1);
Affine a2(2);
Min m(a1,a2);
Min m2( *(new Affine(3)), *(new Affine(4));
PS: Faut dire, j'exagère un peu de faire ça en C++. On m'avait plutot
conseillé Matlab, mais je faisais trop d'erreurs de syntaxe...
Reprenons
class Min : public Fonction {
const Fonction f;
const Fonction g;
// J'utilise des valeurs, et non des références, puisque c'est le
// point de débat (cf
// <slrneutjoo.spk.Marc.Boyer@localhost.localdomain>)
class Min : public Fonction {
const Fonction& f;
const Fonction& g;
% ./fclcpp
fclcpp: fclcpp.cpp:5: virtual double Fonction::operator()(double) const:
Assertion `false' failed.
-------------------------- ECM -----------------------------------------
Donc, c'est bien Fonction:() qui est appelé et pas Affine,
même si je remplace
Min m( Affine(2), Affine(3) );
par
Min m( *new Affine(2), *new Affine(3) );
J'ai peut-être manqué de clarté.
Il plante quand je lui passe des temporaires en paramètre, dans
l'exemple complet et l'exemple minimal. Ce qui me semble normal.
Après, quand je l'appelle avec des non temporaires, genre
Affine a1(1);
Affine a2(2);
Min m(a1,a2);
Min m2( *(new Affine(3)), *(new Affine(4));
PS: Faut dire, j'exagère un peu de faire ça en C++. On m'avait plutot
conseillé Matlab, mais je faisais trop d'erreurs de syntaxe...
Reprenons
class Min : public Fonction {
const Fonction f;
const Fonction g;
// J'utilise des valeurs, et non des références, puisque c'est le
// point de débat (cf
// )
class Min : public Fonction {
const Fonction& f;
const Fonction& g;
% ./fclcpp
fclcpp: fclcpp.cpp:5: virtual double Fonction::operator()(double) const:
Assertion `false' failed.
-------------------------- ECM -----------------------------------------
Donc, c'est bien Fonction:() qui est appelé et pas Affine,
même si je remplace
Min m( Affine(2), Affine(3) );
par
Min m( *new Affine(2), *new Affine(3) );
J'ai peut-être manqué de clarté.
Il plante quand je lui passe des temporaires en paramètre, dans
l'exemple complet et l'exemple minimal. Ce qui me semble normal.
Après, quand je l'appelle avec des non temporaires, genre
Affine a1(1);
Affine a2(2);
Min m(a1,a2);
Min m2( *(new Affine(3)), *(new Affine(4));
PS: Faut dire, j'exagère un peu de faire ça en C++. On m'avait plutot
conseillé Matlab, mais je faisais trop d'erreurs de syntaxe...
Avec des copies
const Fonction f;
je perds le polymorphisme (et sur ce coup, il se plaint que Fonction
a une méthode virtuelle pure).
le polymorphisme existe toujours mais en effet 'Fonction' est
virtuel pure.
En fait, si Fonction est une classe abstraite (avec des
fonctions virtuelles pûre), il ne pourrait même pas en faire une
telle définition. Il ne peut pas exister des objets de type
Fonction en-dehors de la construction ou de la destruction des
objets d'un type dérivé.
Dans de tels cas, ça m'arrive souvent de faire que le paramètre
et la variable membre sont des std::auto_ptr. Quand je fais
vite, et que je n'ai pas le collecteur de Boehm sous la main,
évidemment. Si j'ai Boost installé, je pourrais aussi préférer
boost::shared_ptr dans ce cas précis. (Ce n'est pas une réponse
universelle à l'absence du GC, mais dans le cas des agents
polymorphe, il est tout à fait indiqué.)
Lors de l'exécution du code du destructeur de base, il faut bien
que la table de résolution virtuelle soit celle du type de base.
La norme ne dit rien sur l'état de l'objet une fois qu'on a
sorti du destructeurs -- une implémentation de déboggage
pourrait zapper l'objet avec des 0, ou 0xdeadbeef, par exemple.
Le compilateur a le droit de supposer qu'il n'y a pas de tels
accès, et s'il peut déterminer que le comportement du code dans
le destructeur de base (y compris, évidemment, des fonctions
qu'il pourrait appeler) ne change pas si la table n'est pas
changée, il pourrait ne pas la changer, à titre d'optimisation.
m.f et m.g n'existe pas en tant qu'objet. L'accès en est un
comportement indéfini. Ce qu'il voit (et ce que tu décris),
c'est un artifact de la façon que le compilateur génère le code.
On ne peut pas y compter.
Avec des copies
const Fonction f;
je perds le polymorphisme (et sur ce coup, il se plaint que Fonction
a une méthode virtuelle pure).
le polymorphisme existe toujours mais en effet 'Fonction' est
virtuel pure.
En fait, si Fonction est une classe abstraite (avec des
fonctions virtuelles pûre), il ne pourrait même pas en faire une
telle définition. Il ne peut pas exister des objets de type
Fonction en-dehors de la construction ou de la destruction des
objets d'un type dérivé.
Dans de tels cas, ça m'arrive souvent de faire que le paramètre
et la variable membre sont des std::auto_ptr. Quand je fais
vite, et que je n'ai pas le collecteur de Boehm sous la main,
évidemment. Si j'ai Boost installé, je pourrais aussi préférer
boost::shared_ptr dans ce cas précis. (Ce n'est pas une réponse
universelle à l'absence du GC, mais dans le cas des agents
polymorphe, il est tout à fait indiqué.)
Lors de l'exécution du code du destructeur de base, il faut bien
que la table de résolution virtuelle soit celle du type de base.
La norme ne dit rien sur l'état de l'objet une fois qu'on a
sorti du destructeurs -- une implémentation de déboggage
pourrait zapper l'objet avec des 0, ou 0xdeadbeef, par exemple.
Le compilateur a le droit de supposer qu'il n'y a pas de tels
accès, et s'il peut déterminer que le comportement du code dans
le destructeur de base (y compris, évidemment, des fonctions
qu'il pourrait appeler) ne change pas si la table n'est pas
changée, il pourrait ne pas la changer, à titre d'optimisation.
m.f et m.g n'existe pas en tant qu'objet. L'accès en est un
comportement indéfini. Ce qu'il voit (et ce que tu décris),
c'est un artifact de la façon que le compilateur génère le code.
On ne peut pas y compter.
Avec des copies
const Fonction f;
je perds le polymorphisme (et sur ce coup, il se plaint que Fonction
a une méthode virtuelle pure).
le polymorphisme existe toujours mais en effet 'Fonction' est
virtuel pure.
En fait, si Fonction est une classe abstraite (avec des
fonctions virtuelles pûre), il ne pourrait même pas en faire une
telle définition. Il ne peut pas exister des objets de type
Fonction en-dehors de la construction ou de la destruction des
objets d'un type dérivé.
Dans de tels cas, ça m'arrive souvent de faire que le paramètre
et la variable membre sont des std::auto_ptr. Quand je fais
vite, et que je n'ai pas le collecteur de Boehm sous la main,
évidemment. Si j'ai Boost installé, je pourrais aussi préférer
boost::shared_ptr dans ce cas précis. (Ce n'est pas une réponse
universelle à l'absence du GC, mais dans le cas des agents
polymorphe, il est tout à fait indiqué.)
Lors de l'exécution du code du destructeur de base, il faut bien
que la table de résolution virtuelle soit celle du type de base.
La norme ne dit rien sur l'état de l'objet une fois qu'on a
sorti du destructeurs -- une implémentation de déboggage
pourrait zapper l'objet avec des 0, ou 0xdeadbeef, par exemple.
Le compilateur a le droit de supposer qu'il n'y a pas de tels
accès, et s'il peut déterminer que le comportement du code dans
le destructeur de base (y compris, évidemment, des fonctions
qu'il pourrait appeler) ne change pas si la table n'est pas
changée, il pourrait ne pas la changer, à titre d'optimisation.
m.f et m.g n'existe pas en tant qu'objet. L'accès en est un
comportement indéfini. Ce qu'il voit (et ce que tu décris),
c'est un artifact de la façon que le compilateur génère le code.
On ne peut pas y compter.
Marc Boyer wrote on 07/03/2007 17:19:class Min : public Fonction {
const Fonction f;
const Fonction g;
// J'utilise des valeurs, et non des références, puisque c'est le
// point de débat (cf
// )
le post d'ID "" (1ier
post avec code) contient:class Min : public Fonction {
const Fonction& f;
const Fonction& g;
"" est vu par TB comme un
email pas une ref. news, je ne peux donc pas vérifier (pas le temps de
les ouvrir en source un à un).
nonobstant
class Min : public Fonction {
const Fonction f;
const Fonction g;
ne peux pas (ne doit pas) compiler, puisqu'il impose la construction de
classes virtuelles pures;
parlant de ce qui est imho non compilable, j'ai du mal à conjecturer...
soit tu amalgames différents essais, soit ton compilo est surprenant!
Après, quand je l'appelle avec des non temporaires, genre
Affine a1(1);
Affine a2(2);
Min m(a1,a2);
c'est aussi pire, ton compilo peut choisir de détruire a1 et a2 dès le
retour du constructeur de m; tu continues ici à croire à un ref.
counting; finalement (cette merdouille de) C managé est peut être
parfois nécessaire.
Min m2( *(new Affine(3)), *(new Affine(4));
qui est incorrect (pour d'autres raisons) si ces instances ne sont
jamais détruites.
PS: Faut dire, j'exagère un peu de faire ça en C++. On m'avait plutot
conseillé Matlab, mais je faisais trop d'erreurs de syntaxe...
voire gnuplot ...
Marc Boyer wrote on 07/03/2007 17:19:
class Min : public Fonction {
const Fonction f;
const Fonction g;
// J'utilise des valeurs, et non des références, puisque c'est le
// point de débat (cf
// <slrneutjoo.spk.Marc.Boyer@localhost.localdomain>)
le post d'ID "<slrneut372.roc.Marc.Boyer@localhost.localdomain>" (1ier
post avec code) contient:
class Min : public Fonction {
const Fonction& f;
const Fonction& g;
"slrneutjoo.spk.Marc.Boyer@localhost.localdomain" est vu par TB comme un
email pas une ref. news, je ne peux donc pas vérifier (pas le temps de
les ouvrir en source un à un).
nonobstant
class Min : public Fonction {
const Fonction f;
const Fonction g;
ne peux pas (ne doit pas) compiler, puisqu'il impose la construction de
classes virtuelles pures;
parlant de ce qui est imho non compilable, j'ai du mal à conjecturer...
soit tu amalgames différents essais, soit ton compilo est surprenant!
Après, quand je l'appelle avec des non temporaires, genre
Affine a1(1);
Affine a2(2);
Min m(a1,a2);
c'est aussi pire, ton compilo peut choisir de détruire a1 et a2 dès le
retour du constructeur de m; tu continues ici à croire à un ref.
counting; finalement (cette merdouille de) C managé est peut être
parfois nécessaire.
Min m2( *(new Affine(3)), *(new Affine(4));
qui est incorrect (pour d'autres raisons) si ces instances ne sont
jamais détruites.
PS: Faut dire, j'exagère un peu de faire ça en C++. On m'avait plutot
conseillé Matlab, mais je faisais trop d'erreurs de syntaxe...
voire gnuplot ...
Marc Boyer wrote on 07/03/2007 17:19:class Min : public Fonction {
const Fonction f;
const Fonction g;
// J'utilise des valeurs, et non des références, puisque c'est le
// point de débat (cf
// )
le post d'ID "" (1ier
post avec code) contient:class Min : public Fonction {
const Fonction& f;
const Fonction& g;
"" est vu par TB comme un
email pas une ref. news, je ne peux donc pas vérifier (pas le temps de
les ouvrir en source un à un).
nonobstant
class Min : public Fonction {
const Fonction f;
const Fonction g;
ne peux pas (ne doit pas) compiler, puisqu'il impose la construction de
classes virtuelles pures;
parlant de ce qui est imho non compilable, j'ai du mal à conjecturer...
soit tu amalgames différents essais, soit ton compilo est surprenant!
Après, quand je l'appelle avec des non temporaires, genre
Affine a1(1);
Affine a2(2);
Min m(a1,a2);
c'est aussi pire, ton compilo peut choisir de détruire a1 et a2 dès le
retour du constructeur de m; tu continues ici à croire à un ref.
counting; finalement (cette merdouille de) C managé est peut être
parfois nécessaire.
Min m2( *(new Affine(3)), *(new Affine(4));
qui est incorrect (pour d'autres raisons) si ces instances ne sont
jamais détruites.
PS: Faut dire, j'exagère un peu de faire ça en C++. On m'avait plutot
conseillé Matlab, mais je faisais trop d'erreurs de syntaxe...
voire gnuplot ...
Oui, ça je sais. Puis Laurent m'a dit "Probleme ici. Il ne faut pas
utiliser des references mais des copies.", et c'est pour cela que j'ai
évoqué la perte du polymorphisme.
Désolé. C'est quoi TB ?
Google sait retrouver un post à partir d'un ID si tu veux.
Sauf que dans l'ECM que je viens de poster, c'est
struct Fonction {
virtual double operator()(double x) const { assert(false); return 0;};
// La fonction virtuelle pure remplacee par une fct reelle pour
// que ça compile
Oui, comme on tourne autour d'une solution, il y a diverses versions,
mais le post auquel tu viens de repondre possède un ECM ou Fonction
n'est pas virtuelle pure.
Tient, il garantie pas de n'appeller les destructeur qu'à la fin
du bloc courant ?
ces instances jamais détruites.
Quel est le risque ?
Oui, ça je sais. Puis Laurent m'a dit "Probleme ici. Il ne faut pas
utiliser des references mais des copies.", et c'est pour cela que j'ai
évoqué la perte du polymorphisme.
Désolé. C'est quoi TB ?
Google sait retrouver un post à partir d'un ID si tu veux.
Sauf que dans l'ECM que je viens de poster, c'est
struct Fonction {
virtual double operator()(double x) const { assert(false); return 0;};
// La fonction virtuelle pure remplacee par une fct reelle pour
// que ça compile
Oui, comme on tourne autour d'une solution, il y a diverses versions,
mais le post auquel tu viens de repondre possède un ECM ou Fonction
n'est pas virtuelle pure.
Tient, il garantie pas de n'appeller les destructeur qu'à la fin
du bloc courant ?
ces instances jamais détruites.
Quel est le risque ?
Oui, ça je sais. Puis Laurent m'a dit "Probleme ici. Il ne faut pas
utiliser des references mais des copies.", et c'est pour cela que j'ai
évoqué la perte du polymorphisme.
Désolé. C'est quoi TB ?
Google sait retrouver un post à partir d'un ID si tu veux.
Sauf que dans l'ECM que je viens de poster, c'est
struct Fonction {
virtual double operator()(double x) const { assert(false); return 0;};
// La fonction virtuelle pure remplacee par une fct reelle pour
// que ça compile
Oui, comme on tourne autour d'une solution, il y a diverses versions,
mais le post auquel tu viens de repondre possède un ECM ou Fonction
n'est pas virtuelle pure.
Tient, il garantie pas de n'appeller les destructeur qu'à la fin
du bloc courant ?
ces instances jamais détruites.
Quel est le risque ?