Hallo Forum, ich schätze, ich habe ein "Verbrechen" mit folgendem Szenario begangen: - Interface "I_step" definiert - Eine Basisklasse "Baseclass" erstellt und dort Methoden implementiert, die ich in jeder späteren Instanz auf jeden Fall haben möchte - Einige abgeleitete Klassen erstellt, die von Baseclass erben. Das vermutliche Verbrechen: im Inetrface gibt es eine Funktion, die in der Basisklasse aufgerufen wird, aber erst in den abgeleiteten Klassen definiert wird, da zwar der Zeitpunkt des AUfrufs im Programablauf gleich sein soll, aber das auszuführende unterschiedlich. Habe ich da Murks gebaut?
Wenn die Basisklasse nicht alle Funktionen vom Interface implementiert kann man zwar kein Objekt dieser Klasse erstellen, aber ich denke das ist dir schon aufgefallen. Ansonsten ist das schon in Ordnung.
Sebastian V. schrieb: > Wenn die Basisklasse nicht alle Funktionen vom Interface implementiert > kann man zwar kein Objekt dieser Klasse erstellen, aber ich denke das > ist dir schon aufgefallen. Ansonsten ist das schon in Ordnung. Dann müsste diese Basisklasse eine rein virtuelle Methode enthalten und wäre demnach eine abstrakte Basisklasse. Richtig?
:
Bearbeitet durch User
Durchstarter schrieb: > Das vermutliche Verbrechen: im Inetrface gibt es eine Funktion, die in > der Basisklasse aufgerufen wird, aber erst in den abgeleiteten Klassen > definiert wird, da zwar der Zeitpunkt des AUfrufs im Programablauf > gleich sein soll, aber das auszuführende unterschiedlich. Bis auf die Namen ist dass alles ok. Das Muster (Pattern) hat sogar einen Namen: Strategy Pattern.
:-) Auf der einen Seite bin ich erleichtert, dass die einhellige Meinung positiv ist. Auf der anderen Seite, hatte ich das Gegenteil gehofft, weil sich beschriebene Methode manchmal merkwürdig verhält. @Mark, ja genau, die Basisklasse ist nicht instanziierbar. Manchmal mehrt sich bei mir der Verdacht, dass man mehr oder weniger automatisch in Pattern programmiert, wenn man sich vorher ein paar strukturelle Überlegungen macht??
Torsten R. schrieb: > Das Muster (Pattern) hat sogar einen Namen: Strategy Pattern. Da die entsprechende(n) Methode(n) in der Basisklasse aufgerufen werden, bleibe ich bei "Template Method Pattern" oder Schablonenmethode.
Durchstarter schrieb: > Manchmal mehrt sich bei mir der Verdacht, dass man mehr oder weniger > automatisch in Pattern programmiert, wenn man sich vorher ein paar > strukturelle Überlegungen macht?? Ja, und genau das ist die "gute" Vorgehensweise (im Gegensatz zu: Ich habe hier einen Katalog von 100 Entwurfsmustern; wie verwende ich jetzt bloß möglichst viele davon).
Bei virtuellen Funktionen nicht den virtuellen Destruktor vergessen.
In diesem Szenario kann man sich aber schon in den Fuß schießen: einfach in einem Konstruktor der Basisklasse eine virtuelle Methode aufrufen, die erst in der abgeleiteten Klasse implementiert wird. Aber in einer hohen Warnstufe sollte mittlerweile jeder Compiler davor warnen.
Warpkernauswerfer schrieb: > Torsten R. schrieb: >> Das Muster (Pattern) hat sogar einen Namen: Strategy Pattern. > > Da die entsprechende(n) Methode(n) in der Basisklasse aufgerufen werden, > bleibe ich bei "Template Method Pattern" oder Schablonenmethode. Ja, Du hast Recht! :-)
Georg B. schrieb: > In diesem Szenario kann man sich aber schon in den Fuß schießen: > einfach in einem Konstruktor der Basisklasse eine virtuelle Methode > aufrufen, die erst in der abgeleiteten Klasse implementiert wird. > Ist das wirklich so? Klar der Konstruktor der Ableitungen wurde noch nicht aufgerufen, aber die V-Table sollte schon korrekt gesetzt sein (möglicherweise auch die initializer lists schon abgearbeitet), oder?
Vlad T. schrieb: > Georg B. schrieb: >> In diesem Szenario kann man sich aber schon in den Fuß schießen: >> einfach in einem Konstruktor der Basisklasse eine virtuelle Methode >> aufrufen, die erst in der abgeleiteten Klasse implementiert wird. >> > > Ist das wirklich so? Ja. Eine Instanz einer Klasse C "ist-ein" C erst, wenn der Konstruktor von C fertig ist, nicht vorher. Wenn eine Klasse D von C abgeleitet ist, kann der Konstruktor von C keine Methoden von D aufrufen (auch keine virtuellen), weil zu diesem Zeitpunkt die Instanz noch nicht "ist-ein" D. Vlad T. schrieb: > Klar der Konstruktor der Ableitungen wurde noch nicht aufgerufen, aber > die V-Table sollte schon korrekt gesetzt sein (möglicherweise auch die > initializer lists schon abgearbeitet), oder? Die V-Table ist zum Zeitpunkt, zu dem der Konstruktor von B abläuft, noch nicht auf D gesetzt. Auch die Initializer-List von D ist noch nicht abgearbeitet.
Durchstarter schrieb: > Auf der anderen Seite, hatte ich das Gegenteil gehofft, weil sich > beschriebene Methode manchmal merkwürdig verhält. Je mehr du über dieses merkwürdiges Verhalten erzählst, desto größer ist die Chance dass jemand dir damit helfen kann.
Tja, mit einem klarem Kopf am morgen sieht man mehr:
qDebug() << "Bla bla String" + integerMessert;
>so gehts dann magischer weise doch:
qDebug() << "Bla bla String" + QString::number(messWert);
kaum macht man´s richtig, schon funktioniert´s. Immer wieder
erstaunlich...
Durchstarter schrieb: > Tja, mit einem klarem Kopf am morgen sieht man mehr: > > qDebug() << "Bla bla String" + integerMessert; >>so gehts dann magischer weise doch: > qDebug() << "Bla bla String" + QString::number(messWert); > > kaum macht man´s richtig, schon funktioniert´s. Immer wieder > erstaunlich... Ich bin jetzt nicht so vertraut mit qt, aber
1 | qDebug() << "Bla bla String" << integerMessert; |
sollte bestimmt auch gehen und sieht irgend wie "vertrauter" aus ;-)
Hoppla, war nicht qDebug() sondern myCursor->insertText("Bla bla String" + QString::number(wert)); Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben... Ich werde nach 17 Uhr nichts mehr ins Forum schreiben...
Vlad T. schrieb: > Klar der Konstruktor der Ableitungen wurde noch nicht aufgerufen, aber > die V-Table sollte schon korrekt gesetzt sein (möglicherweise auch die > initializer lists schon abgearbeitet), oder? Nein. Erst wenn der Konstruktor der abgeleiteten Klasse vollständig ausgeführt wurde, kann man davon ausgehen, dass der entsprechende Teil des Objekts auch vollständig initialisiert ist. Deshalb gilt das Objekt auch erst ab dem Zeitpunkt als Instanz dieser Klasse.
Kal Auer schrieb: > [virtual.gif] Da lob ich mir Pascal, da dürfen sogar Konstruktoren virtuell sein :-)
Bernd K. schrieb: > Kal Auer schrieb: >> [virtual.gif] > > Da lob ich mir Pascal, da dürfen sogar Konstruktoren virtuell sein :-) Was da in diesem Bild steht, stimmt aber nicht. Virtulle Memberfunktionen funktionieren auch in Kontruktoren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.