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:
Je ne pense pas que ça soit possible, mais je demande quand même au cas où ...
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) { }
Merci d'avance.
Partager