• [^] # Re: Manque d'info

    Posté par . En réponse au message Pure virtual method called. Évalué à 1.

    C'est vrai que pour le coup on peut dire que j'ai simplifié au maximum :-) .
    En gros, au sein de mon application, je gère différents types de données ayant une interface commune (classe abstraite de base de nom Data), répertoriées dans une classe Catalog de façon automatique. Le but de la manoeuvre est que le catalogue soit automatiquement rempli / vidé à chaque construction / destruction d'un objet dérivé de Data.

    Exemple : en instanciant une classe "Icon" dérivant de data, je veux que cette classe soit automatiquement ajoutée à mon catalogue, et qu'elle en soit retirée à sa destruction. Le tout sans que le développeur de la classe en question n'ait à connaître la façon dont fonctionne le catalogue, et sans non plus qu'il ait à faire les ajouts et suppressions manuellement lors du développement de sa classe.
    Le problème, c'est que le catalogue a besoin d'obtenir certaines informations sur l'instance à ajouter. Dans le cas présent, il s'agit simplement de récupérer une chaine identifiante, mais il est possible qu'on récupère d'autres informations par la suite. La méthode permettant d'obtenir cette ou ces informations est une méthode virtuelle pure définie dans Data.
    J'ai eu mon problème de "pure virtual method called" au moment de l'exécution car j'avais imputé directement au constructeur de Data la charge d'aller signaler la création de l'objet au catalogue. Sauf que lorsque le constructeur de Data est appelée, même si c'est en créant un Icon, le "this" représentant la classe en cours de construction est du type Data et non du type Icon. En appelant Catalog::getInstance()->addItem(this) qui va appeler à son tour le getInfo() du "this" passé en paramètre, on obtient une erreur car ce n'est pas le getInfo de Icon qui est appelé mais bel et bien celui de Data qui est virtuel pur. D'où mon petit message sur le forum.

    En suivant la solution de pepp, j'ai donc rajouté une méthode init() dans ma classe Data ainsi qu'une méthode deinit() appelées respectivement lors de la construction et de la destruction de mes objets dérivés. En appelant ces méthodes au sein des constructeurs et du destructeur de Icon par exemple, le this est bien du type dérivé et non du type de base Data, ce qui résoud le problème. C'est vrai cependant que ça retire un peu d'automatisme en forçant le développeur des classes dérivées à penser à appeler init() / deinit() dans chaque constructeur / destructeur mais à mon sens ça reste propre, vu qu'on ne rajoute pas de dépendance entre les classes dérivées et le catalogue (ou client dans mon cas d'école).