Variable mit erbender Klasse überschreiben
-
Ich habe in meiner Klasse namens Logik folgende Variable deklariert:
SortAlgo* m_sort;SortAlgo ist die Oberklasse, StraightInsertion(s. u.) erbt von dieser.
Wenn im Laufe des Programms bekannt ist, welcher Sortier-Algorithmus benutzt
wird, soll die Variable überschrieben werden:void Logic::setAlgo(SortAlgo* algo) delete m_sort; m_sort = algo; m_sort->m_log = this; }Hier ein Ausschnitt aus meiner main.cpp:
Logic l; StraightInsertion* algo; l.setAlgo(algo);Das Problem ist hierbei, daß m_sort hinterher immer noch "denkt", es sei ein
SortAlgo und kein StraightInsertion. Was mache ich falsch bzw. wie geht es richtig?Gruß, Tigger
-
Was du beschreibst ist mal prinzipiell richtig.
Wahrscheinlich fehlt irgendwo ein virtual.
oder du hast kein objekt angelegtStraightInsertion* algo = new StraightInsertion;Kurt
-
Was müßte denn jetzt virtual sein? Denn auch, wenn ich die main
wie folgt ändere, bleibt der Fehler:Logic l; StraightInsertion* algo = new StraightInsertion(); l.setAlgo(algo);
-
Denke mal dass diene Sortieralgorythmen eine funktion sort() haben. Die müssten virtual sein.
Kurt
-
ZuK schrieb:
Denke mal dass diene Sortieralgorythmen eine funktion sort() haben. Die müssten virtual sein.
KurtAlso sort ist in SortAlgo als virtual deklariert, in den erbenden
Klassen dann natürlich nicht, da hier die Implementierung erfolgt.Das hat ja aber auch nichts mit dem eigentlichen Problem zu tun, oder verstehe
ich einfach nicht, was Du meinst?
-
Tigger75 schrieb:
Das hat ja aber auch nichts mit dem eigentlichen Problem zu tun, oder verstehe
ich einfach nicht, was Du meinst?Wenn das so ist dann verstehe ich das Problem nicht.
Habs so verstanden du setzt mit setAlgo(algo); den neuen algorythmus. Wenn du dann sort() afrufst dann wird trotzdem SortAlgo::sort() aufgerufen.
Kurt
-
ZuK schrieb:
Tigger75 schrieb:
Das hat ja aber auch nichts mit dem eigentlichen Problem zu tun, oder verstehe
ich einfach nicht, was Du meinst?Wenn das so ist dann verstehe ich das Problem nicht.
Habs so verstanden du setzt mit setAlgo(algo); den neuen algorythmus. Wenn du dann sort() afrufst dann wird trotzdem SortAlgo::sort() aufgerufen.
KurtJa, genau so ist es. Und weil sort in SortAlgo virtual ist, stürzt das Programm mit einem Speicherzugriffsfehler ab.
Ich hatte dann zum Testen eine Funktion geschrieben, die jeweils nur ausgibt "Ich bin ein SortAlgo/StraightInsertion" und so festgestellt, daß das Überschreiben nicht klappt.
Also, noch andere Ideen/Tips/Hilfe?
-
Wenn das wirklich alles so ist wie du es beschreibst dann kann ich mir nur mehr vorstellen dass der pointer den du an setAlgo() übergibst nicht gültig ( initialisiert ) ist. Denke jetzt brauchen wir etwas code der das problem zeigt.
Kurt
-
Also mehr Code gibt es dazu eigentlich nicht, ich habe alle relevanten
Code-Stückchen oben aufgeführt...
-
Habe den code nach deinen Aussagen folgendermassen rekonstruiert.
#include <iostream> using namespace std; class Logic; class SortAlgo { public: virtual void sort() { cout << "SortAlgo::sort()" << endl; } friend class Logic; protected: Logic * m_log; }; class InsertionSort : public SortAlgo { public: void sort() { cout << "InsertionSort::sort()" << endl; } }; class Logic { public: void setAlgo(SortAlgo* algo); void sort() { m_sort->sort(); } protected: SortAlgo * m_sort; }; void Logic::setAlgo(SortAlgo* algo) { // delete m_sort; m_sort = algo; m_sort->m_log = this; } int main() { SortAlgo * algo = new InsertionSort; Logic l; l.setAlgo(algo); l.sort(); return 0; }Funktioniert einwandfrei.
Kurt
-
Hallo Kurt!
Nach stundenlangem Draufstarren ist mir jetzt endlich der Unterschied von Deinem
zu meinem Code aufgefallen:SortAlgo * algo = new InsertionSort;StraightInsertion* algo = new StraightInsertion();Wie gesagt, es sind immer die Kleinigkeiten und Flüchtigkeitsfehler, die einen
vor lauter Bäumen den Wald nicht sehen lassen...Vielen Dank für Deine Mühe!
Gruß, Tigger
-
Mach es das nächste mal mit ner Policy, dann hast solche Probleme auch nicht.
Der Quellcode ist ja im besten Fall grausam.