TD 9 C++: héritage, RGB

Rappels


Exercice 1: héritage

  1. Implémentez dans un fichier 1.1.cc la classe Pixel déclarée ci-dessous (télécharger: 1.1.h, ne le modifiez pas!):
    class Pixel {
     public:
      Pixel(int x, int y);
    
      int X() const;
      int Y() const;
    
      // Prints "INVALID" if the pixel is not valid, otherwise prints "(x, y)".
      void DebugPrint() const;
    
     protected:
      // A valid pixel is a pixel with non-negative coordinates.
      bool IsValid() const;
    
     private:
      const int x_;
      const int y_;
    };
    Testez votre code avec:
    rm 1.tar.gz; wget --no-cache http://fabien.viger.free.fr/cpp/td9/1.tar.gz && tar xf 1.tar.gz
    make 1.1
    RENDU: 1.1.cc

  2. Copiez 1.1.h et 1.1.cc dans des fichiers 1.2.h et 1.2.cc.
    Ajoutez en bas de 1.2.h le code suivant:
    class ColoredPixel : public Pixel {
     public:
      ColoredPixel(int x, int y, int color_rgb);
    
      int ColorRgb() const;
      
      // Like before, but we also print the color like this:
      // (4, 3, 0xff0080) -> "(4, 3, R255:G0:B128)"
      void DebugPrint() const;
    
      // We inherit Pixel::IsValid() and don't change it. We don't do more checks.
    
     private:
      const int color_rgb_;
    };
    Implémentez cette classe en bas de 1.2.cc

    Indications
    Testez votre code avec:
    make 1.2
    RENDU: 1.2.cc

  3. Regardez le code suivant (télécharger: 1.3.test.cc):
    #include "1.2.h"
    
    void ApplyDebugPrintTo(const Pixel* p) {
      p->DebugPrint();
    }
    
    int main() {
      ColoredPixel colored_pix(1, 2, 0x334455);
    
      ApplyDebugPrintTo(&colored_pix);
    
      colored_pix.DebugPrint();
    
      ((const Pixel*)(&colored_pix))->DebugPrint();
    
      Pixel p = colored_pix;
      p.DebugPrint();
    }
    Faites-le tourner:
    make 1.3.test
    ./1.3.test
    Modifiez 1.2.h sans toucher à 1.2.cc pour que les 3 premières lignes soient comme la deuxième.
    Vérifiez que le 1.2 marche encore:
    make 1.2
    RENDU: 1.2.h modifié

  4. Copiez 1.2.h et 1.2.cc dans 1.4.h et 1.4.cc, et ré-implémentez la classe ColoredPixel en utilisant la composition: on aura un membre privé Pixel pixel_; au lieu d'hériter de la classe Pixel

    Vérifiez tout seuls, comme des grands: RENDU: 1.4.h, 1.4.cc, 1.4.test.cc, et le Makefile modifié.


Exercice 2: public, private, protected

  1. Entrez dans un fichier 2.1.txt la liste des fonctions FX qui ne compilent pas dans le code ci-dessous (sur 2 colonnes), en tant que simples nombres séparés par des virgules.

    screenshot d'un code à examiner: colonne de gauche screenshot d'un code à examiner: colonne de droite
    Exemple de contenu de 2.1.txt:
    1,2,3
    Vérifiez avec le script 2.1.sh:
    bash 2.1.sh
    RENDU: 2.1.txt

  2. Idem ici. Les nombres que vous entrez dans 2.2.txt doivent correspondre aux commentaires à droite des lignes.
    screenshot d'un code à examiner: colonne de gauche screenshot d'un code à examiner: colonne de droite
    Vérifiez avec le script 2.2.sh:
    bash 2.2.sh
    RENDU: 2.2.txt