Cours C++ GIREF
Séance pratique #3

Exercice 0.

Reprendre votre classe Complexe du devoir 1. Renommer votre méthode d'addition par l'opérateur +=:

Complexe& operator += (const Complexe& pComplexe);

Réécrire votre main en utilisant maintenant votre opérateur surchargé. Exécuter votre programme et suivre la trace dans ddd.
 

Exercice 1.

Ajouter une fonction qui permettra l'impression à l'écran en utilisant les opérateurs <<. Puisque vous avez déjà une fonction affiche() qui permet l'impression, vous pouvez simplement définir une fonction qui fera appel à cette méthode. Par contre, votre affichage ne fonctionne que pour l'écran (cout). Il faudrait donc d'abord modifier la méthode affiche() pour qu'elle accepte un objet ostream quelconque (qui pourrait être un fichier):

class Complexe
{
public:
void affiche(ostream& pOs) const
{
    pOs << ... << endl;
}
...
};

ostream& operator<<(ostream& pOs, const Complexe& pComplexe)
{
    pComplexe.affiche(pOs);
    return pOs;
}

Maintenant, modifier votre main() pour imprimer à l'écran en utilisant l'opérateur <<.
 

Exercice 2.

Écrire une méthode qui fait l'addition d'un double à la partie réelle du Complexe. Voici la signature de la méthode:

...
Complexe operator+ (const double& pReel) const;
...

Maintenant, modifier votre main() pour effectuer cette opération:

Complexe lC1(3,5);
Complexe lC2 = lC1 + 9;

Compiler et exécuter.

Ensuite, modifier la ligne suivante de votre main():

Complexe lC2 = 9 + lC1;

Recompiler.

Comment régler ce problème?

Exercice 3.

Écrire une classe Element qui servira comme classe de base à une 2e classe Element1D. Voici l'interface proposée :

class Element
{
public:
    Element();

    void asgnNoElement(int pNo);
    void imprimeElement() const;

private:
    int aNoElement;
};

Ensuite, écrire la classe Element1D:

class Element1D : public Element
{
public:
    Element1D();

    void asgnNoNoeud(int pNoNoeud0, int pNoNoeud1);
    void imprimeElement() const;

private:
    int aNoNoeud0, aNoNoeud1;
};

Dans la méthode Element1D::imprimeElement(), faire un appel à la même méthode du parent et ensuite écrire ce qui a trait à l'Element1D (ses # de noeuds).

Aussi, ajouter des assertions là où nécessaire!

Écrire un main() qui utilise vos 2 classes.

Exercice 4.

Ajouter une copie constructeur à la classe de base et à la classe Element1D. Dans un 1er temps, ne pas faire d'appel au copie constructeur de la classe de base Element dans copie constructeur d'Element1D. Écrire un main() et faire une copie construction d'un Element1D et suivre la trace dans le débogueur.

Modifier la copie constructeur de l'Element1D pour qu'elle fasse appel à copie constructeur de l'Element. Suivre la trace dans le débogueur.

Exercice 5.

Ajouter un destructeur à chacune des classes. Faire un cout << " Destructeur de la classe ..." dans les 2 destructeurs. Suivre la trace dans ddd.

Exercice 6.

Faire une copie construction d'un Element avec un Element1D. Suivre la trace de l'exécution dans le débogueur.