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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Danish B. (danishbelal)


Bewertung
0 lesenswert
nicht 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)


Bewertung
2 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Alles klar, Vielen Dank für die schnelle Antwort.

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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.