Bonjour a tous, j'ai un petit probleme avec ma conception des exceptions.

J'ai une classe CException avec un constructeur paramétré :

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
 
 
 class CException : public std::exception
 {
  public :
 
   CException () throw() {};
   CException (const std::string &msg) throw() { m_what = msg; };
 
   virtual const char *what (void) const throw() { return m_what.c_str(); };
 
  protected :
 
   std::string m_what;
 
 };
J'ai ensuite une hiérarchie de classe dérivée de CException en fonction de l'exception relevé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
 
 
 class CExceptionMemory : public CException
 {
 };
 
 class CExceptionMemoryAllocFailed : public CExceptionMemory
 {
 };
 
 class CExceptionFile : public CException
 {
 };
 
 class CExceptionFileOpen : public CExceptionFile
 {
 };
 
...
Le probleme est que si je veux lever une exception CExceptionFileOpen par exemple avec comme parametre le nom du fichier :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
 
throw CExceptionFileOpen(filename);
Le compilateur me dit que CExceptionFileOpen n'a pas de constructeur avec un const std::string &, pourtant la classe de base (CException) contient ce type de constructeur.

Je peux corriger ce probleme en implémentant le constructeur paramétré dans chaque classe dérivée mais y a t'il une meilleure solution 'orienté objet' ?

D'après mes recherches, il n'y a pas d'autres solutions mais peut etre que je n'ai pas trouvé.

Merci