C ++ reine virtuelle Klassenfrage

8

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.

    
kreeves 23.07.2009, 16:01
quelle

5 Antworten

10

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.

%Vor%     
Rob Kennedy 23.07.2009, 16:06
quelle
2

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.

    
Timo Geusch 23.07.2009 16:07
quelle
1

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).

    
flodin 23.07.2009 16:06
quelle
1

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).

    
Sean 23.07.2009 16:06
quelle
1

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" .

    
Jorge Gajon 23.07.2009 16:07
quelle

Tags und Links