Ich versuche eine einfache B + Baum Implementierung zu schreiben (sehr frühe Stufen). Ich habe eine virtuelle Klasse mit ein paar Funktionen. Unnötig zu sagen, dass ich sehr neu in diesen Strategien bin und auf alle möglichen Probleme stoße.
Ich versuche einen Root-Knoten innerhalb der BTree-Klasse zu erstellen. Der Wurzelknoten ist eine BBranch, die von BNode? Ich bekomme Fehler
%Vor%Der Code ist dies
%Vor%Danke für die Informationen, die Sie mir geben können.
Der Compiler scheint ziemlich klar zu sein, was falsch ist. Sie können BBranch
nicht deklarieren, da in dieser Klasse immer noch eine reine virtuelle Funktion vorhanden ist. Sie haben ins
definiert, aber del
ist immer noch nicht definiert. Definieren Sie das in BBranch
(und BLeaf
) und Sie sollten in Ordnung sein.
Sie können keine Instanzen abstrakter Klassen deklarieren, bei denen es sich um Klassen mit reinen virtuellen Funktionen handelt.
Außerdem haben Sie root
im Konstruktor deklariert. Sie wollten eine Membervariable sein, was bedeutet, dass neben der Konstruktor, nicht innerhalb deklariert werden muss.
Wenn Sie eine abstrakte Basisklasse wie bei BNode erstellen und eine konkrete abgeleitete Klasse erstellen möchten, müssen Sie alle reinen virtuellen Funktionen implementieren. Sowohl BBranch als auch BLeaf vermissen eine Implementierung von 'del', so dass sie abstrakt bleiben.
Im BTree-Konstruktor versuchen Sie, eine Instanz von BBranch zu erstellen. Aber BBranch hat keine Implementierung von del (), daher ist es eine abstrakte Klasse und kann nicht instanziiert werden. Damit eine Klasse instanziiert werden kann, muss sie konkret sein (d. H. Alle ihre Mitgliedsfunktionen müssen eine Implementierung haben).
Der erste Fehler hat damit zu tun, dass BBranch keine Überschreibung für BNode :: del bietet. Da del eine reine virtuelle Funktion ist (es gibt keine Standardimplementierung), muss jede Klasse, die BNode erbt, entweder eine Implementierung von del bereitstellen oder diese Klasse wird abstrakt sein, d. H. Sie kann nicht instanziiert werden.
Der zweite Fehler liegt darin, dass Sie keine BTree :: root-Membervariable haben. Sie deklarieren root innerhalb des Konstruktors von BTree, und dann wird es zerstört, wenn der Konstruktor fertig ist. Wenn Sie also versuchen, innerhalb von BTree :: ins auf root zuzugreifen, ist der root-Bereich außerhalb des Bereichs (und das Objekt selbst wird wahrscheinlich zerstört).
Die Fehlermeldung gibt Ihnen alle Informationen, die Sie benötigen. Lesen Sie es.
Sie versuchen, eine Variable vom Typ BBranch
zu erstellen, aber Ihre Klasse BBranch
ist eine abstrakte Klasse, genau wie BNode
, von der sie erbt.
Ich rieche, das ist eine Hausaufgabenfrage, also ermutige ich dich, zurück zu deinem Lehrbuch zu gehen und über abstrakte Klassen zu lesen, wie sie benutzt werden und was noch wichtiger ist, was benötigt wird, um die "Abstraktheit"
Tags und Links c++ inheritance polymorphism