Methode einer abgeleiteten Klasse aufrufen
-
Hallo
Ich habe eine Klasse die ungefähr so aussieht:class Frame { private: int x, y, w, h; public: Frame(int X, int Y, int W, int H); ~Frame(); void draw void() { vector<Frame>::iterator it; for (it = next.begin(); it != next.end(); it++) { (*it).draw(); } } }jetzt möchte ich hiervon beispielsweise eine Klasse Button oder Window ableiten und diese dann als Objekthierarchie darstellen.
Dies will leider nicht so, wie ich es mir vorstelle.
Es wird vom ersten Objekt aus die Funktion draw() der Superklasse aufgerufen.
Diese ist allerdings eigentlich nur dazu gedacht, daß ich mich beim Erstellen der Objekte nicht noch um die Verwaltung der Objektstruktur kümmern muß.Kann mir jemand erklären, wie ich nun also die draw() meiner abgeleiteten Klassen aufrufen kann?
-
Ich sehe da keine abgeleiteten Klassen. next ist offenbar ein vector<Frame>, da sind Frame-Objekte drin, keine Objekte von abgeleiteten Klassen. Wenn du die Methode draw virtuell benutzen willst, brauchst du Zeiger oder Referenzen.
-
also geht das GAnze nicht mit vektoren?
wozu hab ich dann die SDL?
ne Abgeleitete Klasse sähe so aus (nur damit du eine siehst..)
class Window : public Frame { public: void draw (void) { glBegin(..); ... gleEnd(); // oder irgendsowas Frame::draw(); } };meine class Frame sollte also am Ende so aussehen?
class Frame { private: int x, y, w, h; Frame *next; FRame *childs; public: Frame(int X, int Y, int W, int H); ~Frame(); void draw void() { vector<Frame>::iterator it; for (it = next.begin(); it != next.end(); it++) { (*it).draw(); } } };und die Verwaltungsmethoden entsprechend die childs etc. dranhängen?
Und wie ruf ich dann mein Ableitungsdraw auf?
-
Bin mir nicht sicher ob ich dich verstehe, aber meinst du es so:
Widget
|
Button
|
PushButtonZuerst wird PushButton.draw() aufgerufen, dies ruf Button.draw() auf, dies wiederum Widget.draw() usw.
Meintest du das so?
-
genau. Wobei das Widget nach meiner hoffnung die Verwaltung für die objekthierarchie übernehmen soll
-
Informier dich mal über virtuelle Methoden.
-
Na dann könntest du es so wie unten machen. Man sollte übrigens von innen nach außen zeichnen, denn sonst sieht der User u.U. ein leeres Fenster, in das noch hineingezeichnet wird, bzw. die Widgets reinpoppen, wenn man das Fenster als letztes zeichnet, kann man sichergehen, dass vorher alles andere gezeichnet wurde.
struct Widget { virtual void draw() const = 0; }; struct Button : public Widget { virtual void draw() const { //Zeichne Button Zeugs }; }; struct PushButton : public Button { virtual void draw() const { //Eigenen Müll darstellen Button::draw(); //Parent zeichnen }; };EDIT: Vertippt und es heißt hier STL und nicht SDL. Die SDL ist ne Medienbibliothek