Je cherche un idiome propre C pour la situation suivante:Comment peut-on imposer l'appel d'une fonction de classe de base après un constructeur de classe dérivé?
class SomeLibraryClass {
public:
SomeLibraryClass() { /* start initialization */ }
void addFoo() { /* we are a collection of foos */ }
void funcToCallAfterAllAddFoos() { /* Making sure this is called is the issue */ }
};
class SomeUserClass : public SomeLibraryClass {
public:
SomeUserClass() {
addFoo();
addFoo();
addFoo(); // SomeUserClass has three foos.
}
};
class SomeUserDerrivedClass : public SomeUserClass {
public:
SomeUserDerrivedClass() {
addFoo(); // This one has four foos.
}
};
Alors, ce que je veux vraiment est pour SomeLibraryClass de faire respecter l'appel de funcToCallAfterAllAddFoos à la fin du processus de construction. L'utilisateur ne peut pas le mettre à la fin de SomeUserClass :: SomeUserClass(), ce qui gâcherait SomeUserDerrivedClass. S'il le place à la fin de SomeUserDerrivedClass, il ne sera jamais appelé pour SomeUserClass.
Pour clarifier ce dont j'ai besoin, imaginez que/* start initialization */acquiert un verrou, et funcToCallAfterAllAddFoos() libère un verrou.
Le compilateur sait quand toutes les initialisations pour un objet sont terminées, mais puis-je obtenir à cette information par une bonne astuce?
+1. C'est la seule réponse ici qui permet au modèle "SomeUserDerrivedClass" de fonctionner (où la classe dérivée hérite du 'Foo's du parent) –
Non, toute approche de passage de constructeur fonctionnerait, vous venez de construire sur la collection passée depuis classes dérivées. – Stephen
Cependant, tous les constructeurs de classes dérivées devraient être public, de sorte qu'il serait possible de contourner accidentellement l'usine. Un moyen de contourner cela? – Thomas