Exercice 89
Énoncé
Soit une classe vecteur3d définie comme suit :
class vecteur3d
{ float v [3] ;
public :
vecteur3d (float c1=0.0, float c2=0.0, float c3=0.0)
{ v[0] = c1 ; v[1] = c2 ; v[2] = c3 ;
}
// à compléter
} ;
Définir l’opérateur [] de manière que :
• il permette d’accéder « normalement » à un élément d’un objet non constant de
type vecteur3d, et cela aussi bien dans une expression qu’en opérande de gauche
d’une affectation ;
• il ne permette que la consultation (et non la modification) d’un objet constant de
type vecteur3d (autrement dit, si v est un tel objet, une instruction de la forme
v[i] = ... devra être rejetée à la compilation).
Rappelons que lorsque l’on définit des objets constants (qualificatif const), il n’est pas
possible de leur appliquer une fonction membre publique, sauf si cette dernière a été
déclarée avec le qualificatif const (auquel cas, elle peut indifféremment être utilisée
avec des objets constants ou non constants). Ici, nous devons donc définir une fonction
membre constante de nom operator [].
Par ailleurs, pour qu’une affectation de la forme v[i] = ... soit interdite, il est
nécessaire que notre opérateur renvoie son résultat par valeur (et non par adresse
comme on a généralement l’habitude de le faire).
Dans ces conditions, on voit qu’il est nécessaire de prévoir deux fonctions membre
différentes, pour traiter chacun des deux cas : objet constant ou objet non constant. Le
choix de la « bonne fonction » sera assuré par le compilateur, selon la présence ou
l’absence de l’attribut const pour l’objet concerné.
Voici la définition complète de notre classe, accompagnée de la définition des deux
fonctions operator [] :
class vecteur3d
210
Précédent

- 211/398

Suivant