implements?
-
CStoll schrieb:
Zu den Referenz-Varianten: 2a ist Käse, das wäre eine konstante Referenz auf ein veränderbares Objekt (analog zu Variante 4) - aber da Referenzen sowieso konstant sind, ist so eine Angabe sinnlos. Richtig wäre
Vektor const& v- und das ist wirklich äquivalent zu 2b.
(du kannst dir merken: alles vor dem &/* bezieht sich auf das Ziel, alles danach auf die Referenz/Zeiger selber)ok, sry das ich so dumm frage, aber ich bin grad etwas verwirrt!?
void methode(klasse *test)
hier bekommt die methode eine variable, die eine adresse enthält, wobei an dieser adresse ein objekt vom typ klasse liegt.
void methode (klasse &test) (bzw const& test)
was enthält test jetzt?
-
pixartist schrieb:
void methode (klasse &test) (bzw const& test)
was enthält test jetzt?Ist doch ganz einfach: Eine Referenz (Alias-Name) auf ein 'klasse'-Objekt.
(wenn du es primitv betrachten willst, ist eine Referenz etwas ähnliches wie ein konstanter Zeiger, der sich bei der Verwendung automatisch dereferenziert - und häufig wird der Compiler sie auch genau so umsetzen)
-
CStoll schrieb:
pixartist schrieb:
void methode (klasse &test) (bzw const& test)
was enthält test jetzt?Ist doch ganz einfach: Eine Referenz (Alias-Name) auf ein 'klasse'-Objekt.
(wenn du es primitv betrachten willst, ist eine Referenz etwas ähnliches wie ein konstanter Zeiger, der sich bei der Verwendung automatisch dereferenziert - und häufig wird der Compiler sie auch genau so umsetzen)
und was passiert jetzt wenn ich das übergebene objekt lokal erstellt hab ?
-
Du meinst so?
void function(int& test) { test+=10; } void test_function() { int i=5; function(i); }Aus Sicht von function() ist es egal, wo das übergebene Objekt liegt - die Referenz ist bei diesem Aufruf ein anderer Name von test_function()::i, also wird der Aufruf auch dessen Wert verändern.
-
pixartist schrieb:
und was passiert jetzt wenn ich das übergebene objekt lokal erstellt hab ?
Was soll passieren? Du greifst in der aufgerufenen Funktion auf das in der aufrufenden Funktion lokal erstellte Objekt zu.
-
nein, ich meine wenn ich das objekt, welches ich lokal erstelle und an die methode in form einer referenz übergebe, in der klasse in einer klassenvariable speichern will. darum gings doch schon 3 posts weiter oben
-
Wenn du das Objekt in eine Klassenvariable (die natürlich kein Zeiger sein sollte) speicherst, wird es dabei natürlich kopiert. Wenn du einen Zeiger auf die Adresse des lokal erzeugten Objekts speicherst, zeigt der natürlicherweise ins Nirvana (und du hast keine Möglichkeit, sowas zu erkennen
).
-
CStoll schrieb:
Wenn du das Objekt in eine Klassenvariable (die natürlich kein Zeiger sein sollte) speicherst, wird es dabei natürlich kopiert. Wenn du einen Zeiger auf die Adresse des lokal erzeugten Objekts speicherst, zeigt der natürlicherweise ins Nirvana (und du hast keine Möglichkeit, sowas zu erkennen
).arghhh aber wie in aller welt soll es dann möglich sein, verschiedene objekte in einem klassenobjekt zu speichern, die von einer klasse erben? mein plan sah so aus:
ich habe eine klasse "panel" oder so, und verschiedene input typen, zb. textEdit, button, dropdown usw, die alle von der klasse SDL_Input erben. nun will ich solch einem panel verschiedene inputs übergeben, die dann nurnoch in dem objekt gespeichert sind und davon verwaltet werden (panel)
das muss doch irgendwie möglich sein?!das problem ist, das ich die verschiedenen input typen alle in EINER liste speichern will, damit ich mir falls benötigt neue input typen erstellen kann, ohne die panel klasse anzurühren
-
Sowas geht normalerweise nur über Pointer (ja, in manchen Situationen stoßen Referenzen an ihre Grenzen). Und dabei mußt du dann dafür sorgen, daß die verpointerten Objekte lange genug überleben.
(eventuell sind dafür auch Smart-Pointer wie std::auto_ptr oder boost::shared_ptr verwendbar)
-
hab ich doch im Anfang auch gesagt, du must die Liste anstatt mir den Daten direkt mit pointern der Basisklasse erstellen, dann kannst du auf diesen auch adressen der abgeleiteten klassen speichern. Du kannst auf die Methoden der Abgeleiteten klassen nur zugreifen, wenn sie auch in der Basisklasse existieren, und dort virtual sind.