En ce qui concerne l’opérateur [], il doit être surdéfini comme fonction membre,
comme l’impose le C++, et cela bien qu’ici une affectation telle e[i] = soit interdite
(alors que c’est précisément pour l’autoriser que C++ oblige d’en faire une fonction
membre !). Pour interdire de telles affectations, la démarche la plus simple consiste à
faire en sorte que le résultat fourni par l’opérateur ne soit pas une lvalue, en la
transmettant par valeur.
Voici ce que pourraient être la définition et la déclaration de notre nouvelle classe
munie de ces deux opérateurs (notez que nous utilisons [] pour définir <) :
class set_int
{ int * adval ; // adresse du tableau des valeurs
int nmax ; // nombre maxi d'éléments
int nelem ; // nombre courant d'éléments
public :
set_int (int = 20) ; // constructeur
~set_int () ; // destructeur
set_int & operator < (int) ;
int operator [] (int) ; // attention résultat par valeur
} ;
set_int::set_int (int dim)
{ adval = new int [nmax=dim] ;
nelem = 0 ;
}
set_int::~set_int ()
{ delete adval ;
}
/* surdéfinition de < */
set_int & set_int::operator < (int nb)
{ // on examine si nb appartient déjà à l'ensemble
// en utilisant l'opérateur []
if ( ! (*this)[nb] && (nelem < nmax) ) adval [nelem++] = nb ;
return (*this) ;
}
/* surdéfinition de [] */
int set_int::operator [] (int nb) // attention résultat par valeur
{ int i=0 ;
// on examine si nb appartient déjà à l'ensemble
// (dans ce cas i vaudra nele en fin de boucle)
while ( (i
return (i
}
À titre indicatif, voici un exemple d’utilisation accompagné du résultat de son
exécution :
#include "set_int.h"
#include
using namespace std ;
main()
{ set_int ens(10) ;
ens < 25 < 2 < 25 < 3 ;
cout << (ens[25]) << " " << (ens[5]) << "\n" ;
}
1 0
209
comme l’impose le C++, et cela bien qu’ici une affectation telle e[i] = soit interdite
(alors que c’est précisément pour l’autoriser que C++ oblige d’en faire une fonction
membre !). Pour interdire de telles affectations, la démarche la plus simple consiste à
faire en sorte que le résultat fourni par l’opérateur ne soit pas une lvalue, en la
transmettant par valeur.
Voici ce que pourraient être la définition et la déclaration de notre nouvelle classe
munie de ces deux opérateurs (notez que nous utilisons [] pour définir <) :
class set_int
{ int * adval ; // adresse du tableau des valeurs
int nmax ; // nombre maxi d'éléments
int nelem ; // nombre courant d'éléments
public :
set_int (int = 20) ; // constructeur
~set_int () ; // destructeur
set_int & operator < (int) ;
int operator [] (int) ; // attention résultat par valeur
} ;
set_int::set_int (int dim)
{ adval = new int [nmax=dim] ;
nelem = 0 ;
}
set_int::~set_int ()
{ delete adval ;
}
/* surdéfinition de < */
set_int & set_int::operator < (int nb)
{ // on examine si nb appartient déjà à l'ensemble
// en utilisant l'opérateur []
if ( ! (*this)[nb] && (nelem < nmax) ) adval [nelem++] = nb ;
return (*this) ;
}
/* surdéfinition de [] */
int set_int::operator [] (int nb) // attention résultat par valeur
{ int i=0 ;
// on examine si nb appartient déjà à l'ensemble
// (dans ce cas i vaudra nele en fin de boucle)
while ( (i
À titre indicatif, voici un exemple d’utilisation accompagné du résultat de son
exécution :
#include "set_int.h"
#include
using namespace std ;
main()
{ set_int ens(10) ;
ens < 25 < 2 < 25 < 3 ;
cout << (ens[25]) << " " << (ens[5]) << "\n" ;
}
1 0
209
