J'ai une classe de base:moyen sûr pour initialiser une classe dérivée
class CBase {
public:
virtual void SomeChecks() {}
CBase() {
/* Do some checks */
SomeChecks();
/* Do some more checks */
}
};
et une classe dérivée:
class CDerived : public CBase {
public:
virtual void SomeChecks() { /* Do some other checks */ }
CDerived() : CBase() {}
};
Cette construction semble être un peu bizarre, mais dans mon cas cela est nécessaire , car CBase effectue certaines vérifications et CDerived peut mélanger des contrôles entre eux. Vous pouvez le voir comme un moyen de "hooker" des fonctions dans le constructeur. Le problème avec cette construction est que lors de la construction de CDerived une base CBase est construite et il n'y a aucune conscience de CDerived (donc la fonction surchargée SomeChecks() n'est pas appelée).
que je pouvais faire quelque chose comme ceci:
class CBase {
public:
void Init() {
/* Do some checks */
SomeChecks();
/* Do some more checks */
}
virtual void SomeChecks() {}
CBase(bool bDoInit=true) {
if (bDoInit) { Init(); }
}
};
class CDerived : public CBase {
public:
virtual void SomeChecks() { /* Do some other checks */ }
CDerived() : CBase(false) { Init() }
};
Ce n'est pas vraiment sûr, parce que je veux le constructeur avec le paramètre faux protégé, de sorte que seules les classes dérivées peuvent appeler. Mais alors je vais devoir créer un second constructeur (qui est protégé) et lui faire prendre d'autres paramètres (probablement inutilisés car le constructeur est appelé quand Init() n'a pas besoin d'être appelé).
Donc, je suis assez coincé ici.
EDIT En fait, je veux quelque chose comme ceci:
class CBase {
protected:
void Init() { /* Implementation of Init ... */ }
CBase() { /* Don't do the Init(), it is called by derived class */ }
public:
CBase() { Init(); } // Called when an object of CBase is created
};
class CDerived : public CBase {
public:
CDerived() : CBase() { Init(); }
};
Il me semble qu'il est impossible d'avoir 2 constructeurs avec les mêmes arguments à protéger et que public?
Comme indiqué, l'appel de méthodes virtuelles dans les constructeurs ne conduit pas au comportement souhaité. Je pense que la solution de pimpl est la plus raisonnable. Le sujet est bien couvert dans Scott Meyers Effective C++ book. – count0
En fait, ce n'est pas un pimpl. Au moins, la chose appelée n'est pas. Voir ici: http://en.wikipedia.org/wiki/Opaque_pointer#C.2B.2B – sbi
En fait, c'est. :-) Lisez votre page wiki. Mais un bon livre sur Design Patterns comme GOF serait probablement mieux. –