Bonjour,
j'ai bien regarder la FAQ et ait trouvé un lien sur la surcharge de l'opérateur << avec des fonctions membres virtuelles d'une autre classe, mais l'utilisation d'une fonction d'affichage ne me convient, car je dois impérativement passé par les accesseurs. L'ennui c'est que je suis vraiment au niveau tout juste débutant en C++, alors je sollicite votre aide car après des jours passé sur le pb je n'avance pas d'un poil !
Alors voilà, j'ai 2 classes mères dépendantes l'une de l'autre, Observateur et Observable. Observable a 2 classes filles, NO2 et PM10 (qui représentent des capteurs des dits polluants). Observateur a une classe fille, StationMesure (qui représente la station charge de surveiller les mesures des capteurs de NO2 et PM10).
Dans Observable, on a une méthode virtuelle pure ChangerEtat(int), qui permet de simuler les mesures effectuees par les capteurs en entrant nous meme une valeur. Elle est défini dans NO2 et PM10. Cette méthode appelle une méthode virtuelle de Observable, Alerter(), lorque la mesure rentrée dépasse le seuil maximum que doit tolérer le capteur N02 ou PM10.
Cette méthode Alerter() appelle alors TraiterAlerte(const Observable*), méthode virtuelle pure de Observateur définie dans StationMesure qui doit afficher dans la console un message d'alerte.
Voici les bouts de code intéressant :
dans PM10.cpp par exple:
dans Observable.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void PM10::ChangerEtat(int mesure) { moyJour=mesure; //moyJour attribut qui represente l'etat actuel if(moyJour < seuilBas || moyJour > seuilHaut) { this->Alerter(); } }
dans StationMesure.cpp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 void Observable::Alerter() { unsigned int n; Observateur* const* tabStations = listObj.obtenirElements(n); for(unsigned int i=0; i< n; i++) { tabStations[i]->TraiterAlerte(this); } }
Aucune erreure de compilation, mais quand je fais ChangerEtat avec une valeur au dessus du seuil, le programme fait tous les affichages qu'il doit faire puis termine sans planter, sauf qu'il n'affiche pas le message de TraiterAlerte ! Pourtant, j'ai fait une surcharge de <<. De plus, dès que je mets le prototype de ma surcharge de << dans le .h de StationMesure, le compilateur me dit que je n'ai pas le droit car capteur n'est pas déclaré dans ce scope...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ostream &operator<<( ostream &out, Observable *capteur ) { out << capteur->ObtenirId(); return out; } void StationMesure::TraiterAlerte(const Observable *A) const { cout<< "Le capteur "<< A << "donne l'alerte car une mesure anormale a ete observee." << endl; }
Je désespère un peu alors j'espère que vous pourrez m'aider....
J'ai fait un test en mettant un cout dans la boucle de ChangerEtat, et il y rentre bien, en revanche, j'ai fait la meme chose dans la boucle d'Alerter, mais là, le programme n'y rentre pas....
Partager