8
votes

C ++ Pure Classe virtuelle Question

Je tente d'écrire une simple mise en œuvre de l'arbre B + (très précoce). J'ai une classe virtuelle avec quelques fonctions. Inutile de dire que je suis très nouveau dans ces stratégies et je rencontre toutes sortes de problèmes.

Je tente de créer un nœud racine dans la classe BTREE. Le nœud racine sera une Bbranch, qui devrait hériter de Bnode? Je reçois des erreurs xxx

Le code est celui-ci xxx

merci pour toutes les informations que vous pouvez me donner. < / p>


1 commentaires

Je tiens à vous remercier tous pour vos réponses ... J'admets, je ne suis pas un excellent programmeur C ++ et j'essaie d'appliquer certaines de ces nouvelles idées (classes virtuelles / fonctions) dans ce projet. J'ai également des difficultés à faire des têtes ou des queues des codes d'erreur, mais vous avez tous fait un excellent travail pour m'aider à voir mon erreur. Merci!


5 Réponses :


10
votes

Le compilateur semble être assez clair sur ce qui ne va pas. Vous ne pouvez pas déclarer un bbranch car il existe toujours une fonction virtuelle pure dans cette classe. Vous avez défini ins , mais del est toujours indéfini. Définissez cela dans Bbranch (et BLAFE ) Et vous devez être bien.

Vous ne pouvez pas déclarer des instances de classes abstraites, qui sont des classes qui ont des fonctions virtuelles pures.

En outre, vous avez déclaré root dans le constructeur . Vous vouliez dire que c'est une variable membre , ce qui signifie qu'il doit être déclaré à côté de le constructeur, pas à l'intérieur < Pré> xxx


0 commentaires

1
votes

Dans le constructeur BTREE, vous essayez de créer une instance de Bbranch. Mais Bbranch n'a pas de mise en œuvre de Del (), c'est donc une classe abstraite et ne peut être instanciée. Pour qu'une classe soit instanciée, elle doit être concrète (c'est-à-dire toutes ses fonctions membres doivent avoir une mise en œuvre).


0 commentaires

1
votes

La première erreur concerne le fait que Bbranch ne fournit aucun remplacement pour Bnode :: del. Etant donné que del est une fonction virtuelle pure (il n'a pas de mise en œuvre par défaut), toute classe qui hérite de Bnode doit soit une implémentation de DEL, ou de cette classe sera abstraite, c'est-à-dire qu'elle ne peut pas être instanciée.

La deuxième erreur est parce que vous n'avez pas de bTtree :: variable membre racine. Vous déclarez raconter la racine dans le constructeur de Btree, puis il est détruit lorsque le constructeur se termine, alors lorsque vous essayez d'accéder à la racine au sein de Breee :: INS, la racine est hors de portée (et l'objet lui-même est probablement détruit).


0 commentaires

2
votes

Si vous créez une classe de base abstraite comme si vous avez fait avec Bnode et que vous souhaitez créer une classe dérivée en béton, vous devez mettre en œuvre des fonctions virtuelles toutes les . Bbranch and Bluef manquait une implémentation de 'del' afin qu'ils restent abstraites.


0 commentaires

1
votes

Le message d'erreur vous donne toutes les informations dont vous avez besoin. Lisez-le.

Vous essayez de créer une variable de type bbranch , mais votre classe bbranch est une classe abstraite, comme Bnode , à partir de laquelle Il hérit de.

Je sens ceci est une question de devoirs. Je vais donc vous encourager à revenir à votre manuel et à lire des classes abstraites, comment sont-elles utilisées et plus important encore, ce qui est nécessaire pour mettre fin à la "abstrait" < / em>.


0 commentaires