Correction 18
Constructeurs/Destructeurs
Exercice 1 : un peu de poésie pour commencer (constructeurs/destructeurs, niveau 1)
Exercice n°50 (page 121 et 303) de l'ouvrage C++ par la pratique.
Voici une solution possible à cet exercice :
#include <iostream>
using namespace std;
class Fleur {
public:
Fleur(const string& espece, const string& couleur)
: couleur(couleur)
{
cout << espece << " fraichement cueillie" << endl;
}
Fleur(const Fleur& f)
: couleur(f.couleur)
{
cout << "Fragile corolle taillee" << endl;
}
~Fleur() { cout << "qu'un simple souffle..." << endl; }
void eclore() const { cout << "veine de " << couleur << endl; }
private:
const string couleur;
};
int main ()
{
Fleur f1("Violette", "bleu");
Fleur f2(f1);
cout << "dans un cristal ";
f2.eclore();
cout << "Donne un poeme un peu fleur bleue" << endl
<< "ne laissant plus ";
return 0;
}
Exercice 2 : balles rebondissantes, (Constructeurs/destructeurs, niveau 2)
Exercice n°51 (page 122 et 303) de l'ouvrage C++ par la pratique.
Une proposition de solution pour cet exercice :
#include <cmath>
#include <iostream>
using namespace std;
const double g(9.81);
class Balle
{
public:
Balle(const double eps);
Balle(const double eps, const double h);
double hRebond() const;
double vRebond() const;
void rebondit(const unsigned int nrebonds = 1);
void rebondit(const double haut, const unsigned int nrebonds);
private:
void prochainRebond();
private:
double epsilon; // coefficient de rebond de la balle
double h; // maximum hauteur pour rebond courant
double v; // vitesse initiale rebond courant
};
int main()
{
Balle tennis(0.75);
/* 1ère question, on peut directement utiliser le modèle */
tennis.rebondit(20.0, 4);
cout << "Partant d'une hauteur de 20, une balle " << endl
<< "de tennis (eps=0.75) normalement constituée" << endl
<< "atteint une hauteur de " << tennis.hRebond()
<< " à son 4è rebond." << endl;
cout << endl;
Balle pingpong(0.9, 10.0);
/* 2è question, notre modèle ne mémorisant pas en interne
le nombre de rebonds effectué, il faut le faire pour lui */
unsigned int rebonds(0); // compteur de rebonds
do
{
pingpong.rebondit();
++rebonds;
} while (pingpong.vRebond() > 3.0);
cout << "Ce n'est qu'au " << rebonds << "e rebonds" << endl
<< "qu'une balle de ping-pong (eps=0.9)" << endl
<< "lâchée d'une hauteur de 10," << endl
<< "rebondit avec une vitesse inférieur à 3..." << endl;
return 0;
}
Balle::Balle(const double eps)
: epsilon(eps), h(0.0), v(0.0)
{ }
Balle::Balle(const double eps, const double h)
: epsilon(eps), h(h), v(0.0)
{ }
double Balle::hRebond() const { return h; }
double Balle::vRebond() const { return v; }
void Balle::rebondit(const unsigned int nrebonds)
{
for (unsigned int i(0); i<nrebonds; ++i)
prochainRebond();
}
void Balle::rebondit(const double haut,
const unsigned int nrebonds)
{
h = haut;
rebondit(nrebonds);
}
void Balle::prochainRebond()
{
v = epsilon * sqrt(2*h*g);
h = (v*v)/(2*g);
}
Dernière mise à jour : 2025/03/13 08:47