[C++]Problem mit mergesort implemetierung

AcidR4in

Ensign
Registriert
Juli 2005
Beiträge
175
hi, hab folgendes problem :

Code:
compiling the source files ...
g++ -o lib/Mergesort.o -c src/Mergesort.cpp -Wall
g++ -o lib/MergesortMain1.o -c src/MergesortMain1.cpp -Wall
src/MergesortMain1.cpp: In function 'void runTest(int) [with T = int]':
src/MergesortMain1.cpp:56:   instantiated from here
src/MergesortMain1.cpp:15: error: cannot declare variable 'mergesort1' to be of abstract type 'Mergesort<int>'
src/Mergesort.h:9: note:   because the following virtual functions are pure within 'Mergesort<int>':
src/Mergesort.h:39: note:  bool Mergesort<T>::fill(T*, int) [with T = int]
src/Mergesort.h:42: note:  T* Mergesort<T>::sort() [with T = int]
src/Mergesort.h:45: note:  int Mergesort<T>::getSize() [with T = int]
src/Mergesort.h:48: note:  bool Mergesort<T>::isMember(T) [with T = int]
src/Mergesort.h:51: note:  void Mergesort<T>::print() [with T = int]
src/Mergesort.h:54: note:  char* Mergesort<T>::toString() [with T = int]
gmake: *** [compile] Error 1

hier sind meine src files
home.arcor.de/acid.r4in/algodat
 
habs schon hab vergessen das virtual wegzumachen im mergesort.h
 
Es liegt nicht am virtual, sondern daran, dass die Funktionen in MergeSort immnoch abstrakt sind (=0).

Ansonsten finde ich es etwas dreist, ohne eine Frage (schön und gut, dass du ein Problem hast, sonst würdest du wohl nicht posten), einen Haufen Code hinzuklatschen.


Um mal nicht nur zu meckern ^^, hier mal etwas konstruktive Kritik:

Warum eine Basisklasse und Virtualität? Templates sind Compilezeit-Polymorphismus, virtuelle Funktionen Laufzeit-Polymorphismus. Die Basisklasse ist überflüssig. Selbst wenn es mehrere Klassen geben sollte die sich an die AbstractContainer-Schnittstelle halten, so wäre Virtualität überflüssig, da es bei Verletzung der Schnittstelle Compiler-Fehler gibt.

Warum ist size ein int und kein unsigned? Planst du negative Größen? Ich denke nicht, von daher ist das falsch. size_t wäre die perfekte Wahl.

Wichtiger Design-Fehler: Ein Merge-Sort-Algorithmus ist kein Container. Öffentliche Vererbung bedeutet immer ist ein. Vererbung ist hier also missbräuchlich verwendet.

Niemals veränderbare Handles auf private Member herausgeben -> siehe Rückgabewert von sort.

Schnittstelle von toString: Muss der Aufrufer erraten, ob ihm der Speicher gehört oder nicht? Falls ja, woher soll er wissen, wie der Speicher allokiert wurde? (malloc, new, eigener Allokator)

Und warum eigentlich die explizite Instanziierung? Zu Übungszwecken okay, ansonsten eher hinderlich / unangenehm zu warten.


Und noch eine Unschönheit - man implementiert virtuelle Funktionen nicht (implizit) inline in Headerdateien, da sonst viele (besonders ältere) Compiler in jede Übersetzungseinheit wo der Header inkludiert wird die virtuelle Funktionstabelle emittieren. Kann bei starker Verwendung des Headers zu CodeBloat führen, was gerade in Embedded-Systemen unangenehm ist. Geht natürlich garnicht anders, wenn die Basisklasse ein Template ist, aber mit einem anderen Design wäre das garnicht erst nötig.

Gruß,
Edgar
 
Zuletzt bearbeitet:
Zurück
Oben