1 #ifndef __TABLEAU__
   2 #define __TABLEAU__
   3 
   4 #include <iostream>
   5 using namespace std;
   6 
   7 // Un objet-fonction qui calcule une homothetie
   8 // Le facteur d'homothétie est passé au constructeur de l'objet-fonction
   9 class homo {
  10 public:
  11     homo(float f) : facteur(f) {};
  12     float operator()(float x) const {return facteur*x;};
  13 private:
  14     float facteur;
  15 };
  16 
  17 // Un objet-fonction qui ecrete le tableau
  18 // Le seuil est passé au constructeur de l'objet-fonction
  19 class ecret {
  20 public:
  21     ecret(float s) : seuil(s) {};
  22     float operator()(float x) const {return (x > seuil) ? seuil : x;};
  23 private:
  24     float seuil;
  25 };
  26 
  27 class Tableau {
  28 public:
  29 
  30         // Le constructeur principal - on passe la dimension du tableau en parametre
  31         explicit Tableau(size_t );
  32 
  33         // Le trio infernal
  34         Tableau (const Tableau & );
  35         Tableau & operator=(const Tableau &);
  36         ~Tableau();
  37 
  38         // renvoie la taille du Tableau
  39         size_t size() const { return sz;};
  40         
  41         // renvoie un element du Tableau sans deborder
  42         float & operator[](size_t i);
  43         
  44         // meme chose - version const
  45         float operator[](size_t i) const;
  46         
  47         // operateurs +=
  48         // Le parametre est un autre Tableau
  49         Tableau & operator+=(const Tableau & );
  50         
  51         // Le parametre est un float
  52         Tableau & operator+=(float );
  53         
  54         // imprime le Tableau sur la sortie standard
  55         void print () const;
  56         
  57         // La famille de fonctions transform: on leur passe un objet-fonction
  58         // On est obligé de définir autant de fonctions transform qu'il y a de transformations (d'objets-fonctions) définies
  59         void transform(const homo& );
  60         void transform(const ecret &);
  61 
  62 private:
  63         const size_t sz;
  64         float *A;
  65         
  66         // Le signe __ rappelle qu'il s'agit de methodes privees
  67         void __copie (float src, float dest[], size_t s);
  68         void __copie (float src[], float dest[], size_t s);
  69 };
  70 
  71 // Une fonction qui n'est pas une methode
  72 Tableau operator+(const Tableau& t1, const Tableau& t2);
  73 
  74 #endif