Forum: PC-Programmierung C++ lokales Objekt in std::vector


von Danish B. (danishbelal)


Lesenswert?

Nabend,

ich habe folgenden Code:
1
void EventManager::addEvent(Event event)
2
{
3
   [...]
4
   // event_list ist ein std::vector<Event>
5
   event_list.push_back(event);
6
   [...]
7
}
Laut [1] ist push_back als 'void push_back(const T& value) definiert, 
bekommt also eine Referenz auf das Objekt übergeben.
Wenn dem so wäre, dann wäre die Referenz ungültig, sobald 
EventManager::addEvent verlassen wird.
Das ist allerdings nicht so, die Elemente des vectors sind nach wie vor 
gültig.

Warum?



[1]: http://de.cppreference.com/w/cpp/container/vector/push_back

von Felix U. (ubfx)


Lesenswert?

Danish B. schrieb:
> Warum?

Weil es Kopien sind. Im Vektor sind Objekte gespeichert, keine 
Referenzen und beim Dereferenzieren der Referenz wird der 
Copy-Konstruktor aufgerufen.

: Bearbeitet durch User
von Danish B. (danishbelal)


Lesenswert?

Alles klar, Vielen Dank für die schnelle Antwort.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Danish B. schrieb:
> Alles klar, Vielen Dank für die schnelle Antwort.

Noch als Ergänzung: Wenn Du Referenzen speichern wolltest, müsste der 
Typ von event_list `std::vector< Event& >` sein. Referenzen lassen sich 
aber nicht in vectoren speichern, weil ihnen dazu wesentlich 
Eigenschaften fehlen (Zuweisbarkeit, etc.).

von Sebastian V. (sebi_s)


Lesenswert?

Wenn man wirklich Referenzen in Containern speichern wollte gibts dafür: 
http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

von Rolf M. (rmagnus)


Lesenswert?

Torsten R. schrieb:
> Noch als Ergänzung: Wenn Du Referenzen speichern wolltest, müsste der
> Typ von event_list `std::vector< Event& >` sein. Referenzen lassen sich
> aber nicht in vectoren speichern, weil ihnen dazu wesentlich
> Eigenschaften fehlen (Zuweisbarkeit, etc.).

Eine Referenz ist zuweisbar. Sie ist im Prinzip einfach ein zusätzlicher 
Name für ein bestehendes Objekt. Dementsprechend wird alles, was ich mit 
der Referenz mache, auf das Objekt angewendet, auf das sie verweist. So 
kann man auch der Referenz etwas zuweisen, wenn die Klasse das nicht 
verbietet.
Allerdings kann man eine Referenz, wenn sie einmal erzeugt ist, nicht 
auf ein anderes Objekt verweisen lassen, als das, wofür sie erzeugt 
wurde.

: Bearbeitet durch User
von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Rolf M. schrieb:

> Allerdings kann man eine Referenz, wenn sie einmal erzeugt ist, nicht
> auf ein anderes Objekt verweisen lassen, als das, wofür sie erzeugt
> wurde.

Naja, so ziemlich der Semantik von "Referenz läßt sich nicht zuweisen" 
entspricht :-) (Im Gegensatz zu "referenziertes Objekt läßt sich 
zuweisen")

von Rolf M. (rmagnus)


Lesenswert?

Torsten R. schrieb:
> Rolf M. schrieb:
>
>> Allerdings kann man eine Referenz, wenn sie einmal erzeugt ist, nicht
>> auf ein anderes Objekt verweisen lassen, als das, wofür sie erzeugt
>> wurde.
>
> Naja, so ziemlich der Semantik von "Referenz läßt sich nicht zuweisen"
> entspricht :-) (Im Gegensatz zu "referenziertes Objekt läßt sich
> zuweisen")

Da ist für mich schon ein großer Unterschied im Verständnis des Konzepts 
einer Referenz. Eine Referenz selbst ist kein Objekt (wie es z.B. ein 
Zeiger wäre), sondern wie gesagt nur ein weiterer Name für ein 
bestehendes Objekt. Oft wird eine Referenz aber als eine Art konstanter 
Zeiger gesehen, was so nicht wirklich zum Konzept von Referenzen, wie es 
in C++ vorgesehen ist, passt. Eine Zuweisung ist auch ganz problemlos 
möglich:
1
int a = 3;
2
int & b {a};
3
b = 5;
Man weist hier b (was das selbe ist wie a) einen neuen Wert zu.

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
Noch kein Account? Hier anmelden.