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 :

Classes virtuelles et référence comme donnée membre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut Classes virtuelles et référence comme donnée membre
    Bonjour,

    Je voudrais générer un log lorsqu'une exception est attrapée.

    J'ai une classe virtuelle CException et 2 classes qui dérivent de celle-ci, CWarningException et CCriticalException.
    J'ai également une classe virtuelle CLog et 2 classes qui dérivent de celle-ci, CInfoLog et CErrorLog.
    La classe CException contient une donnée membre CLog pour signaler qu'on va générer un log lorsqu'une exception est attrapée.
    La classe CWarningException va instancier une CInfoLog tandis que la classe CCriticalException va générer une CErrorLog.

    Donc, dans la classe CException, je dois déclarer CLog sous forme de pointeur ou référence afin de préserver les aspects polymorphiques de cette dernière.
    Sous forme de pointeur, cela m'oblige de faire une allocation dynamique de CInfoLog dans CWarningException, idem pour CErrorLog dans CCriticalException.
    J'aurais donc préféré le stocker sous forme de référence. Cependant, si je fais ça, je suis obligé de passer l'objet référent en paramètre du constructeur de CException. Ce qui est stupide vu que je sais qu'une CWarningException contient une CInfoLog et CCriticalException contient une CErrorLog.
    L'idéal serait que je puisse avoir une variable membre de type CInfoLog dans la classe CWarningException et dise à CException qu'il s'agit d'une référence sur cette dernière.
    Mais je ne sais pas si c'est possible ...

    Voici ce que ça donnerait sur une version simplifiée:

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    class			CException  
    {
    public:
    			CException(LPCTSTR lpLogDescription, LPCTSTR lpDisplayDescription = NULL);
    	virtual		~CException() = 0;
     
    protected:
    	CLog		&m_rLog;
    };
     
    class			CWarningException :
    	public		CException  
    {
    public:
    			CWarningException(LPCTSTR lpLogDescription, LPCTSTR lpDisplayDescription = NULL);
    	virtual		~CWarningException();
     
    protected:
    	CInfoLog	m_infoLog;
    };
     
    class			CCriticalException :
    	public		CException  
    {
    public:
    			CCriticalException(LPCTSTR lpLogDescription, LPCTSTR lpDisplayDescription = NULL);
    	virtual		~CCriticalException();
     
    protected:
    	CErrorLog	m_errorLog;
    };
     
     
     
    			CException::CException(LPCTSTR lpLogDescription, LPCTSTR lpDisplayDescription) :
    				m_rLog(/* donnée membre de la classe fille */)
    {
    }
     
     
    			CWarningException::CWarningException(LPCTSTR lpLogDescription, LPCTSTR lpDisplayDescription) :
    				CException(lpLogDescription, lpDisplayDescription)
    {
    }
    Je ne pense pas que ça soit possible, mais je demande quand même au cas où ...

    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Donc, dans la classe CException, je dois déclarer CLog sous forme de pointeur ou référence afin de préserver les aspects polymorphiques de cette dernière.
    J'ai l'impression que tu as le même genre de soucis que j'ai eu récemment :

    http://www.developpez.net/forums/d67...question-crtp/

    Du coup, je te conseille le lien que m'avait donné Alp, très intéressant :

    Plutôt que du polymorphisme dynamique, du polymorphisme statique doit te suffire.

  3. #3
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Je ne sais pas si ça correspond à ce que je cherche, mais je vais y jeter un oeil

    En tout cas, j'ai encore pas mal de notions à apprendre en C++

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sous forme de pointeur, cela m'oblige de faire une allocation dynamique de CInfoLog dans CWarningException, idem pour CErrorLog dans CCriticalException.
    Euh... Pourquoi?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Euh... Pourquoi?
    Tu as raison, c'était pourtant simple

    Le déclarer sous forme de pointeur dans CException, et dans le constructeur de classe fille, faire tout simplement un :

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Doxygen - Données membre documentée comme fonction "C"
    Par slashbrus dans le forum Autres éditeurs
    Réponses: 0
    Dernier message: 26/03/2011, 10h56
  2. Donnée membre constante d'une classe en c++
    Par bmmdrs dans le forum C++
    Réponses: 2
    Dernier message: 18/01/2009, 14h11
  3. Réponses: 1
    Dernier message: 26/09/2007, 17h16
  4. Réponses: 3
    Dernier message: 24/04/2005, 14h19
  5. Réponses: 6
    Dernier message: 08/11/2004, 18h23

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