OVH Cloud OVH Cloud

operateur + comme fonction virtuelle pure dans une classe de base

33 réponses
Avatar
Marc
Bonjour, mon compilateur me refuse la définition de classe suivante :

class CTypeBase {

public :

CTypeBase() : _ismissing(true) {}
CTypeBase(const CTypeBase &x) : _ismissing(x._ismissing) {}

const bool& is_missing(void) const { return _ismissing;}
void set_missing(void) { _ismissing=true;}

// opérateurs de base redéfinis

virtual const CTypeBase operator+(const CTypeBase&) const=0;

protected :
private :

bool _ismissing;

};

Il m'indique juste que la classe CTypeBase ne peut contenir des fonctions
pures.
Ah bon !? pourquoi ?
ça n'a aucun sens pour moi de définir l'opérateur + dans la classe de base !
Merci de vos lumières

3 réponses

1 2 3 4
Avatar
James Kanze
"Marc" writes:

|> > En somme, tu te sers d'un static pour le temporaire. Et qu'est-ce
|> > qui se passe si tu as besoin de plus d'un temporaire à la fois ?
|> > Quelque chose du genre :
|> > (a + b) * (c + d)
|> > par exemple. Tu vas utiliser le même mainbuffer pour le résultats
|> > de a + b et les résultats de c + d ?

|> En fait, j'ai 2 buffers,

Ce qui fait qu'il y aura des problèmes si le compilateur décide qu'il
lui faut trois temporaires.

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

"Marc" writes:

|> > En somme, tu te sers d'un static pour le temporaire. Et qu'est-ce
|> > qui se passe si tu as besoin de plus d'un temporaire à la fois ?
|> > Quelque chose du genre :
|> > (a + b) * (c + d)
|> > par exemple. Tu vas utiliser le même mainbuffer pour le résultats
|> > de a + b et les résultats de c + d ?

|> En fait, j'ai 2 buffers,

Ce qui fait qu'il y aura des problèmes si le compilateur décide qu'il
lui faut trois temporaires.


Pire, avec la manière dont il les choisit, il peut avoir des
problèmes si le premier temporaire n'est pas utilisé pour
bâtir le deuxième résultat.

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

Avatar
James Kanze
"Marc" writes:

|> > void f(CTypeBase&, int nbBuf) {
|> > if (nbBuf >= 0) {
|> > f(a + b, nbBuf-1);
|> > }
|> > }

|> Excuse-moi, mais je ne comprends pas bien ce que fais cette
|> fonction... Pour moi, 2 buffers suffisent, puisque les opérateurs
|> n'ont jamais + de 2 opérandes (?: non surchargeable).

Ce qui ne garantit rien. C'est le compilateur qui décide l'ordre
q'évaluation. Si tu écris quelque chose comme :

std::cout << a + b << ',' << c + d << ',' << e+f << std::end ;

le compilateur peut très bien décider d'evaluer les trois expressions +
d'abord -- c'est même la façon la plus logique de précéder sur certaines
architectures.

Quant à la fonction de Jean-Marc, c'était une façon simple à te montrer
que le nombre de buffers nécessaires n'est pas bornés. Dans son cas,
évidemment, f ne fait rien avec le résultat. Tu ne rémarque donc pas
qu'il s'est écrasé. (Aussi, il faut supposer que a et b sont des
globaux. Donc, le résultat est le même dans tous les cas.)

|> Dans le cas de mon problème, le type de base a été introduit pour
|> implémenter les valeurs manquantes sur les types fondamentaux. J'ai
|> aussi dérivé un type Variant. Et crois-moi, j'ai testé, la méthode
|> avec buffers va beaucoup + vite qu'un modèle proxy.

Comme on t'as dit, si tu t'en fous de la correction, c'est facile à
faire vite.

|> Comme le but est de faire des statistiques, la vitesse compte aussi
|> pour moi.

Alors : return 0. Le résultat n'est peut-être pas toujours correct, mais
c'est vite.

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