#include <iostream>
using namespace std;

class Gray {
private:
  double level;
  void setLevel(double level) { this->level = level; }
public:
  Gray(double level) { setLevel(level); }
  double getLevel() { return level; }
  static Gray White;
  static Gray Black;
  friend ostream &operator<<(ostream &o,Gray &g) { return o << g.getLevel(); }
};

Gray Gray::White(1.0);
Gray Gray::Black(0.0);

int main() {
  cout << Gray::White << endl;
  cout << Gray::Black << endl;
}

/*
  1 : lire le code ci-dessus...
  2 : aucune méthode n'est disponible publiquement permettant de modifier la
  valeur des attributs des instances (i.e. on ne peut changer la valeur d'une
  couleur).
  3 : piste, fabriquer une structure dynamique statique permettant de retrouver
  toutes les instances créées et de retrouver une instance étant donné la valeur
  du niveau de gris. Cacher le constructeur et passer par une méthode statique
  de fabrique qui vérifie si l'instance existe (si oui la renvoie, si non
  instancie la classe, range l'instance dans la collection statique et la
  renvoie).
*/