Lors de l'expérimentation du modèle de visiteur en C++, je suis arrivé à un problème idiot en ce qui concerne l'implémentation d'une interface dérivée. Je soupçonne que je ne sais pas comment formuler la question correctement, car je n'ai pas trouvé de solution à cela ailleurs.Interface dérivée de l'outil de struct C++
J'ai la struct base suivante:
struct Visitor {
virtual void visit(const Resources) = 0;
virtual void visit(const Population) = 0;
};
Je déclare quelques réalisations concrètes de visiteur avec quelques fonctionnalités supplémentaires. Voilà comment je veux que mes déclarations à ressembler:
struct EndVisitor : public Visitor{
virtual bool hasEnded();
};
struct SetupVisitor : public Visitor{
};
struct ScoreVisitor : public Visitor{
virtual unsigned int getScore();
};
Lors de la définition, disons par exemple ScoreVisitor, l'IDE et le compilateur reconnaît les déclarations de fonctions supplémentaires dans ScoreVisitor:
unsigned int ScoreVisitor::getScore() {
return total;
}
Cependant, la mise en œuvre les fonctions des visiteurs ne sont pas reconnus par le compilateur ou IDE (Funtion 'visit' not declared in class 'ScoreVisitor'
):
void ScoreVisitor::visit(const Resources resources) {
total += resources.score;
}
void ScoreVisitor::visit(const Population population) {
total += population.score;
}
Si je déclare ScoreVisitor répétant les fonctions de visiteur, le code compile, mais cela me laisse beaucoup de code copié-collé dans toutes les déclarations spécialisées de Visitor, que je souhaite éviter. Ce n'est pas ce que je veux que mes déclarations à ressembler:
struct ScoreVisitor : public Visitor{
virtual void visit(const Resources);
virtual void visit(const Population);
virtual unsigned int getScore();
};
Comment puis-je déclare des versions spécialisées de visiteurs sans avoir à copier-coller toutes les fonctionnalités que le visiteur déclare déjà?
Bienvenue dans C++! Vous devez déclarer tous les membres d'une classe correctement avant de les définir. Même les méthodes virtuelles que vous remplacez des classes de base. – Nim
Merci Nim! Je comprends votre réponse comme: Je ne serai pas en mesure d'éviter de déclarer les fonctions d'interface dans une déclaration spécialisée de visiteur? – Yakitawa
Oui, sauf si vous avez une hiérarchie où certaines fonctionnalités sont implémentées à différents niveaux d'abstraction. – Nim