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

C++ Discussion :

[POO] Accessibilite d'une fonction membre


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Par défaut [POO] Accessibilite d'une fonction membre
    Salut,

    J'ai une application console qui fonctionne et a laquelle je veux rajouter une couche graphique. L'application gere des evenements qui dependent des actions de l'utilisateur et des evenements qui en sont independants.

    Mon probleme se situe dans l'affichage des erreurs. Dans mon application console toutes les erreurs etaient traitees par la fonction independante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void print_error(std::string error)
    {
         std::cout << "ERREUR: " << error << std::endl;
    }
    Cette fonction etait accessible de n'importe qu'elle classe qui incluait le header adequat.

    Maintenant, j'utilise wxWidget et c'est un composant appartenant a la classe WX_FORM (responsable du graphisme) qui gere l'affichage des erreurs.

    Comment puis-je faire pour que ma fonction print_error() puisse acceder a une fonction membres de WX_FORM sachant qu'elle ne peut pas elle-meme declarer une classe WX_FORM ?

    Merci de m'apporter vos lumieres.

    PS : Mes excuses pour le sujet de ce post qui constitue une pietre description de mon probleme.
    Je m'excuse egalement aupres du moderateur qui devra peut-etre deplacer ce post dans un forum plus adapte (conception ? wxWidget ?). Je ne savais vraiment pas ou le mettre.

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Tu peux faire une méthode publique statique de la classe graphique. Ainsi, toutes les classes de ton application pourront l'appeler et lui donner un message d'erreur à afficher (en tant qu'argument de la fonction).

    NB: Je pense que tu voulais parler des wxFrame, et non des WX_FORM.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Par défaut
    En fait, j'ai bien une classe WX_FORM mais, effectivement, elle derive de wxFrame.

    Il est donc temps que je me penche sur les fonctions statiques.

    Merci du conseil.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Si tu passes en wxWidget, tu devrais regardé la doc sur wxLog qui offre pas mal de souplesse sur la redirection de ce type de message d'erreur.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Par défaut
    Citation Envoyé par spoutspout Voir le message
    Tu peux faire une méthode publique statique de la classe graphique. Ainsi, toutes les classes de ton application pourront l'appeler et lui donner un message d'erreur à afficher (en tant qu'argument de la fonction).
    J'ai regarde un peu comment fonctionnait la staticite. Mais, je ne suis pas sur que ca puisse me statisfaire.

    D'apres ce que j'ai compris, declarer un membre static permet de le rendre unique dans chacune des instances de la classe. Par extension, j'imagine que c'est la meme chose avec une methode static. Voila ce que je ferai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class WX_FORM : public wxFrame
    {
         public:
         WX_FROM();
         ~WX_FORM();
     
         static print_error(std::string msg);
         //plein d'autres methodes
    };
    Mais si je veux utiliser la fonction print_error() dans la classe JAMBON je suis quand meme obliger d'instancier une nouvelle classe WX_FORM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JAMBON::status()
    {
         WX_FORM new_app;
         new_app.print_error("ALERTE: quelqu'un a mange la derniere tranche !!!");
    }
    Cette instanciation va quand meme mettre en memoire plein d'objet qui ne servent a rien.

    Je commence a me demander si j'ai pas un probleme de strcuture avec mon programme.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Bonjour,
    Si tu passes en wxWidget, tu devrais regardé la doc sur wxLog qui offre pas mal de souplesse sur la redirection de ce type de message d'erreur.
    J'ai regarde la description dans la doc mais apparement cette classe ecrit dans un fichier et ce n'est pas ce que je veux faire.

  7. #7
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Pour un appel à une fonction statique, tu peux faire ça sans instancier la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void JAMBON::status(const wxString &sMessage)
    {
        WX_FORM::print_error(sMessage);
    }
    Citation Envoyé par Tymk Voir le message
    J'ai regarde la description dans la doc mais apparement cette classe ecrit dans un fichier et ce n'est pas ce que je veux faire.
    Pas seulement. Avec la fonction SetActiveTarget(), tu définis où vont être tracés tes appels à wxLogMessage() et autres. ça peut être certes un fichier, mais aussi un wxTextBox, un flux, la sorties standards, ...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Par défaut
    Citation Envoyé par spoutspout Voir le message
    Pour un appel à une fonction statique, tu peux faire ça sans instancier la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void JAMBON::status(const wxString &sMessage)
    {
        WX_FORM::print_error(sMessage);
    }
    Alors ca, c'est tres tres fort ! Meme en tant que programmeur occasionnel, je dois avouer que la connaissance de cette fonctionnalite m'aurait eviter pas mal de bricolage.

    Citation Envoyé par spoutspout Voir le message
    Avec la fonction SetActiveTarget(), tu définis où vont être tracés tes appels à wxLogMessage() et autres. ça peut être certes un fichier, mais aussi un wxTextBox, un flux, la sorties standards, ...
    Ok, avec ces 2 possibilites je devrais pouvoir m'en sortir.

    Merci.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 309
    Par défaut
    En approfondissant un peu la notion de staticite, je me suis rendu compte qu'une fonction statique ne peut acceder qu'a des membres ou fonctions eux-memes statiques.

    Donc, si je veux afficher mes messages d'erreurs dans un wxTextCrtl, par exemple, je suis oblige de le declarer "static". Mais je ne comprends pas bien les implications que ca peut avoir. Si ca oblige juste mon composant a etre unique, alors pas de probleme, ma wxFrame doit de toute facon etre unique.

    Y a-t-il autre chose ? Faut-il que je declare carrement toute ma wxFrame "static" ?

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Tymk Voir le message
    J'ai regarde la description dans la doc mais apparement cette classe ecrit dans un fichier et ce n'est pas ce que je veux faire.
    Bonjour,
    C'est un peu plus complet que ça:
    "
    • wxLogStderr This class logs messages to a FILE *, using stderr by default as its name suggests.
    • wxLogStream This class has the same functionality as wxLogStderr, but uses ostream and cerr instead of FILE * and stderr.
    • wxLogGui This is the standard log target for wxWidgets applications (it is used by default if you don't do anything) and provides the most reasonable handling of all types of messages for given platform.
    • wxLogWindow This log target provides a "log console" which collects all messages generated by the application and also passes them to the previous active log target. The log window frame has a menu allowing user to clear the log, close it completely or save all messages to file.
    • wxLogNull The last log class is quite particular: it doesn't do anything. The objects of this class may be instantiated to (temporarily) suppress output of wxLogXXX() functions. As an example, trying to open a non-existing file will usually provoke an error message, but if for some reasons it is unwanted, just use this construction:
    "
    Je te conseille de regarder un peu plus la doc wxWidget, car j'ai l'impression que tu cherche à réinventer la roue.

  11. #11
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Le plus simple, c'est de déclarer 1 classe et 1 interface.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    // -- Exemple:
     
    class IErrorPerso
    {
         virtual void Status(const std::wstring &message)=0;
    }
     
    class WxErrorPerso: public IErrorPerso
    {
    public:
    	/// Log Panel
    	static wxTextCtrl *mTextCtrl;
     
    	WxErrorPerso(wxTextCtrl *textCtrl): mTextCtrl( textCtrl){}
     
    	void Status(const std::wstring &message)
    	{
    		if(mTextCtrl)
    			*mTextCtrl << log << L"\n";
    	}
    }
    Pourquoi faire ainsi ?
    Le gros avantage, c'est que même un plugin peut écrire un message d'erreur ne sachant même pas que les wxWidgets se trouve dans ton programme pour faire ton GUI.
    Tout est transparent.

  12. #12
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Pour finir, tu déclares un pointeur "IErrorPerso" dans un endroit qui est accessible par tous. Et on peut l'enrober dans une autre classe de base (ici 'ErrorPerso').
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    //.h
     
    class ErrorPerso
    {
       public:
    	static Message(const std::wstring &message)
    	 {
    		if(gErrorPerso);
      			 gErrorPerso->Status(message);
    		else
    		{
    			// GUI not activate yet
    			DebugBreak;
    		}
    	}
      private:
    	static IErrorPerso *gErrorPerso;
    }
     
    //.cpp
    IErrorPerso * ErrorPerso::gErrorPerso = 0 ;

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/04/2006, 13h02
  2. Réponses: 4
    Dernier message: 01/12/2005, 12h33
  3. Réponses: 3
    Dernier message: 28/11/2005, 12h15
  4. Réponses: 3
    Dernier message: 06/11/2005, 18h02
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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