OVH Cloud OVH Cloud

surcharge de fonctions virtuelles pures

8 réponses
Avatar
Mike
Bonjour,

Dans un énoncé de TP, on me demande de faire la chose suivante :
Ajouter la surcharge de l'opérateur + à la classe B en ajoutant son
prototype à la class A ( qui est virtuelle pure et dont dérive B ).

Le prototype donné :
B& operator +(B&);

Ce que j'ai tenté de faire :

class A
{
A& operator + (A&) = 0;
};

class B : A
{
B& operator + (B&) { // implementation ... }
};

Bien évidemment, il y a des erreurs de compilation car le compilateur
considère B toujours comme virtuelle.

Est-ce une erreur dans l'énoncé ou bien ai-je raté un épisode ? Merci de
m'éclairer un peu..

8 réponses

Avatar
Horst Kraemer
On Sat, 19 Jun 2004 20:42:19 +0200, "Mike" wrote:

Dans un énoncé de TP, on me demande de faire la chose suivante :
Ajouter la surcharge de l'opérateur + à la classe B en ajoutant son
prototype à la class A ( qui est virtuelle pure et dont dérive B ).

Le prototype donné :
B& operator +(B&);

Ce que j'ai tenté de faire :

class A
{
A& operator + (A&) = 0;
};

class B : A
{
B& operator + (B&) { // implementation ... }
};

Bien évidemment, il y a des erreurs de compilation car le compilateur
considère B toujours comme virtuelle.

Est-ce une erreur dans l'énoncé ou bien ai-je raté un épisode ? Merci de
m'éclairer un peu..


L'énonce dit qu'il faut ajouter le prototype *donné* à A. Donc

class B;
class A
{
virtual B& operator+(B&)=0;
};

class B:public A
{
B& operator+(B&) { return *new B;}
};

Bien entendu tout cela n'a pas de sens parce que un opérateur+ ne
renvoie jamais une réference mais plutot un objet,

--
Horst

Avatar
Alexandre
bonjour,

"Mike" a écrit dans le message de
news:cb21e7$1456$
Bonjour,

Dans un énoncé de TP, on me demande de faire la chose suivante :
Ajouter la surcharge de l'opérateur + à la classe B en ajoutant son
prototype à la class A ( qui est virtuelle pure et dont dérive B ).


est-ce l'énoncé exact du TP ? Parce que ça n'a pas bcp d'interet.


Le prototype donné :
B& operator +(B&);


Là encore c'est stupide de renvoyer une référence... A quel objet va-t-elle
faire référence ? La sémantique d'un opérateur + doit créer une nouvelle
variable, donc...

De plus c'est un peu bête de mettre dans une classe A une fonction utilisant
des B (qui dérive de A). Normalement, A n'a pas à savoir ce qu'est un B...
Ce serait plutot l'inverse...

Donne l'énoncé exact du TP, pour voir ...

Avatar
Mike
"Alexandre" a écrit dans le message de
news:40d5d774$0$7705$
| > Dans un énoncé de TP, on me demande de faire la chose suivante :
| > Ajouter la surcharge de l'opérateur + à la classe B en ajoutant son
| > prototype à la class A ( qui est virtuelle pure et dont dérive B ).
|
| est-ce l'énoncé exact du TP ? Parce que ça n'a pas bcp d'interet.

C'est l'énoncé exact. Je ne peux le donner vu qu'il est en allemand :) mais
cela me semblait ésotérique aussi de retourner une référence sur des
opérateurs +, *, -.

Enfin je voulais juste savoir si c'était normal que je trouve ce prof
incompétent. Avec ton message, j'ai un début de réponse..
Avatar
Fabien LE LEZ
On Sun, 20 Jun 2004 20:42:32 +0200, "Mike" :

| > Dans un énoncé de TP, on me demande de faire la chose suivante :
| > Ajouter la surcharge de l'opérateur + à la classe B en ajoutant son
| > prototype à la class A ( qui est virtuelle pure et dont dérive B ).
|
| est-ce l'énoncé exact du TP ? Parce que ça n'a pas bcp d'interet.

C'est l'énoncé exact.


AMHA, il y a une faute de frappe -- j'espère pour le prof en question
qu'il voulait écrire "=" ou "+=" ...


--
schtroumpf schtroumpf

Avatar
Fabien LE LEZ
On Sat, 19 Jun 2004 20:42:19 +0200, "Mike" :

Dans un énoncé de TP, on me demande de faire la chose suivante :
Ajouter la surcharge de l'opérateur + à la classe B en ajoutant son
prototype à la class A ( qui est virtuelle pure et dont dérive B ).

Le prototype donné :
B& operator +(B&);


Le prof proposera-t-il une correction de cet exercice ? Si oui, merci
de (tenter de) la reproduire ici -- j'aimerais connaître le fin mot de
l'histoire.


--
schtroumpf schtroumpf

Avatar
Mike
Pour résumer l'énoncé :

Soit l'interface Set ( dans l'énoncé elle est template mais je raccourcis
l'écriture ) :

class Set
{
virtual iterator insert(int elt) = 0;
virtual int size() = 0;
virtual int count(int elt) = 0;
virtual void erase(int elt) = 0;
virtual iterator begin() = 0;
virtual iterator end() = 0;
virtual iterator find(int elt) = 0;
};

Écrire une classe dérivée de Set et qui implémente l'interface Set par
délégation :

class StandardSet : Set { ... };

Maintenant, rajouter les opérateur +, -, * ( union, différence,
intersection ) à l'interface Set et les implémenter dans votre classe
dérivée :

StandardSet& operator + (StandardSet& ); // prototypes donnés par le
prof
StandardSet& operator - (StandardSet& );
StandardSet& operator * (StandardSet& );

Voilà l'énoncé.

Donc j'en ai déduis que s'il voulait qu'on rajouter ces opérateurs à
l'interface Set, il fallait les rendre virtuels purs dans Set. ( sinon quel
intérêt de préciser qu'il fallait les rajouter à l'interface Set... ).

Enfin, il nous a filé une implantation d'un AVL Tree qu'on doit utiliser
pour implémenter la classe, mais quand je vois le code de l'AVL Tree, je me
suis posé des questions sur sa santé mentale :)
Avatar
kanze
"Mike" wrote in message
news:<cb4lqj$26vj$...
"Alexandre" a écrit dans le message de
news:40d5d774$0$7705$
| > Dans un énoncé de TP, on me demande de faire la chose suivante :
| > Ajouter la surcharge de l'opérateur + à la classe B en ajoutant
| > son prototype à la class A ( qui est virtuelle pure et dont dérive
| > B ).

| est-ce l'énoncé exact du TP ? Parce que ça n'a pas bcp d'interet.

C'est l'énoncé exact. Je ne peux le donner vu qu'il est en allemand :)


Donne toujours:-). Ça nous arrive de citer des bouts de texte en
anglais ; je ne sais pas pourquoi on serait plus raciste vis-à-vis des
allemands.

mais cela me semblait ésotérique aussi de retourner une référence sur
des opérateurs +, *, -.


En général, comme on a dit, les opérateurs +, -, etc. doivent renvoyer
une valeur, et non une référence. Ce qui fait qu'ils se combine très mal
avec l'héritage -- en admettant que j'ai un:

operator+( Base const& lhs, Base const& rhs )

et que Base est une classe abstraite, quel doit être le type de rétour ?

Si vraiment il faut un polymorphisme avec de tels opérateurs, il faut
passer par l'idiome de lettre/envellope de Coplien.

Enfin je voulais juste savoir si c'était normal que je trouve ce prof
incompétent. Avec ton message, j'ai un début de réponse..


Ou bien, il est incompétent, ou bien, il cherche à vous faire découvrir
vous même pourquoi c'est une mauvaise idée de melanger l'héritage et les
opérateurs arithmétique.

--
James Kanze GABI Software
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
kanze
"Mike" wrote in message
news:<cb4u60$2ao7$...

Pour résumer l'énoncé :

Soit l'interface Set ( dans l'énoncé elle est template mais je raccourcis
l'écriture ) :

class Set
{
virtual iterator insert(int elt) = 0;
virtual int size() = 0;
virtual int count(int elt) = 0;
virtual void erase(int elt) = 0;
virtual iterator begin() = 0;
virtual iterator end() = 0;
virtual iterator find(int elt) = 0;
};


Tu es sûr que tu as bien tout copié ? Parce que s'il n'y a pas de
destructeur virtuel là dedans, le prof est réelement incompétent. Au
point d'être dangéreux.

S'il n'a pas déclaré size() et count() const, c'est inquiètant aussi.

Écrire une classe dérivée de Set et qui implémente l'interface Set par
délégation :

class StandardSet : Set { ... };

Maintenant, rajouter les opérateur +, -, * ( union, différence,
intersection ) à l'interface Set et les implémenter dans votre classe
dérivée :

StandardSet& operator + (StandardSet& ); // prototypes donnés par le
prof
StandardSet& operator - (StandardSet& );
StandardSet& operator * (StandardSet& );

Voilà l'énoncé.


C'est prèsque l'idiome de lettre/envellope. Avec juste assez de
différences pour que ça ne peut pas marcher:-).

--
James Kanze GABI Software
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