IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

pb surcharge de << avec accesseurs d'une autre classe


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1
    Par défaut pb surcharge de << avec accesseurs d'une autre classe
    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:
    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 Observable.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);
    	}
    }
    dans StationMesure.cpp :

    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;
    }
    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...

    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....

  2. #2
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Hello,
    As tu vérifié avec un débogueur que tu passes réellement dans la fonction TraiterAlerte (le problème pourrait venir des autres fonctions utilisées, notamment la fonction Alerter qui me semble suspecte) ? Le prototype de l'operateur de flux devrai également être déclaré après la déclaration de la classe Observable, donc probablement dans le fichier Observable.h (si tu l'as appelé comma ca).

  3. #3
    Membre éprouvé Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Par défaut
    bonjour,

    Citation Envoyé par questiongenerator
    Code C++ : 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);
    	}
    }
    Quand est-ce que n est initialisé dans cette fonction ?
    est-ce que listObj.obtenirElement(n) prend n en argument par référence et l’initialise ?
    Si ce n’est pas le cas, tu utilise une variable non initialisée, elle a donc une valeur aléatoire à l’exécution. Puisque tu as relevé que le programme ne rentre pas dans cette boucle, as-tu vérifié la valeur de n juste avant d’y rentrer ?

  4. #4
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    En parlant de l'opérateur de redirection, par convention, sa signature devrait être quelque chose comme ça pour les flux, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ostream& operator << (std::ostream&, const UnType&);
    Pour ce qui est de ton problème, je pense la même chose que nowahn.

Discussions similaires

  1. Compilation d'une classe java avec cmd appelant une autre classe
    Par y_chafaqi dans le forum Général Java
    Réponses: 10
    Dernier message: 09/12/2009, 20h24
  2. Réponses: 3
    Dernier message: 07/07/2006, 15h49
  3. Update d'un champs avec valeur d'une autre table.
    Par dbuweb dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/06/2006, 11h36
  4. Réponses: 5
    Dernier message: 02/09/2004, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo