LendableBook.

Nous voulons étendre la classe Book avec un service qui indique si un livre est prêté ou non.

Un livre prêté.

La nouvelle classe à écrire est LendableBook: cette classe est une sous classe de Book.

En plus de la méthode héritée de Book, elle dispose:

  • d’un attribut _status de type bool qui indique si le livre est prêté ;

  • d’un constructeur qui initialise l’attribut à false ;

  • des méthodes publiques bool isLended() const qui renvoit la valeur de _status, void lend() qui modifie le valeur de _status à true et void giveBack() qui modifie le valeur de _status à false.

Ecrire cette classe: fichiers LendableBook.hpp et LendableBook.cpp.

Avec l'exemple de programme suivant : Vérifier le comportement dans l'utilisation du constructeur par copie et de l'affectatio et de libération. Pour cela, utiliser les traces contenues dans le code de la classe `CharSequence`. Vérifier aussi la libération mémoire.
#include <cstdio>

#include "LendableBook.hpp"

int main() {
  std::printf("\ninstantiation\n");
  LendableBook lb{"9 791039", "Legendes & lattes"};
  std::printf("lb isLended: %d\n", lb.isLended());
  
  LendableBook lc{"9 782376", "Sidooh"};
  lc.lend();
  std::printf("lc isLended: %d\n", lc.isLended());

  std::printf("\ninstantiation par copie\n");
  LendableBook ld{lc};
  std::printf("ld isLended: %d\n", ld.isLended());
  
  std::printf("\nAffectation\n");
  lc=lb;
  std::printf("lc isLended: %d\n", lc.isLended());

  std::printf("\nfin main\n");

  return 0;
}  
Même exemple en utilisant les streams pour l'affichage.
#include <iostream>

using std::cout;
using std::endl;

#include "LendableBook.hpp"

int main() {
  cout << "\ninstantiation\n";
  LendableBook lb{"9 791039", "Legendes & lattes"};
  cout << "lb isLended: " << std::boolalpha << lb.isLended() << endl;
  
  LendableBook lc{"9 782376", "Sidooh"};
  lc.lend();
  cout << "lc isLended: " << std::boolalpha << lc.isLended() << endl;

  cout << "\ninstantiation par copie\n";
  LendableBook ld{lc};
  cout << "ld isLended: " << std::boolalpha << ld.isLended() << endl;
  
  cout << "\nAffectation\n";
  lc=lb;
  cout << "lc isLended: " << std::boolalpha << lc.isLended() << endl;

  cout << "\nfin main\n";

  return 0;
}
Après ces vérifications, vous pouvez mettre en commentaire les traces contenues dans le code de la classe `CharSequence`.

La méthode héritée getInfo().

Dans la classe LendableBook, modifier le traitement de la méthode getInfo() pour renvoyer une instance de CharSequence de valeur “_status:_id:Book:_title” (avec comme valeur de _status lended ou ready to lend).

Appel de la méthode getInfo().

Écrire un programme progamLend.cpp qui utilise la méthode getInfo() :

  • sur une instance de LendableBook allouée automatiquement ;
  • sur un pointeur de type Book contenant l’adresse de cette instance de LendableBook ;
  • sur une référence de type Book sur cette instance de de LendableBook.

Et ajouter l’affichage de sizeof(LendableBook) et de sizeof(Book).

Compiler, exécuter et expliquer le comportement de ces appels.