PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Referenzen in Containern speicherbar?


Nasenbaer
2011-07-27, 16:14:35
Hi,
ist es möglich Objekt-Referenzen in einem Container (z.B. std::vector) zu speichern oder muss man dazu zwingend Pointer verwenden?

Marscel
2011-07-27, 16:25:09
Geht nur mit Pointern.

Krishty
2011-07-28, 09:13:14
Was C++ Referenzen nennt (Aliase) kannst du generell nicht speichern, da sie weder eine Adresse noch eine Größe haben. Du musst also auf Zeiger ausweichen (aber bloß nicht auf pure, denn Zeiger als Objektbesitzer sind wie Ständer im Bordell – nur gut, so lange sie geschützt werden).

std::auto_ptr ist nicht zur Speicherung in STL-Containern geeignet. Ich erinnere mich, dass ich einen entsprechenden Container selber schreiben musste (falls du Beispiele brauchst, such nach auto_vector). Möglicherweise hat sich das mit der C++0x-Revision der STL aber endlich geändert.

Nasenbaer
2011-07-28, 11:22:33
Ich hab einfache Zeiger genommen. Da Die Struktur auch nur temporär und klassenintern verwendet wird, ist das auch nicht das Ding.

Coda
2011-07-28, 13:33:37
Es gibt in Boost Pointer-Container mit Referenz-Semantik:
http://www.boost.org/doc/libs/1_47_0/libs/ptr_container/doc/ptr_container.html

Referenzen ergeben auch deshalb keinen großen Sinn, weil man einem Base-Class-Referenz-Typ keine abgeleitete Klasse zuweisen kann. Man hätte also keinen Polymorphismus mehr.

Wenn du sowieso keinen Polymorphismus hast, kannst du die Objekte auch direkt in den Container geben. Dann musst du allerdings mindestens Copy-Constructor und operator= implementieren. Für std::set/map auch noch operator<. Für std::unordered_set/unordered_map soweit ich weiß std::hash.

del_4901
2011-07-28, 14:04:08
Referenzen ergeben auch deshalb keinen großen Sinn, weil man einem Base-Class-Referenz-Typ keine abgeleitete Klasse zuweisen kann. Man hätte also keinen Polymorphismus mehr.
Natuerlich geht das!

Coda
2011-07-28, 14:14:49
Edit: Hast ja recht

Die Sache ist, das trotzdem keine VTable verwendet wird, weil die Klasse dann immer zur Compilierzeit bekannt ist. Ich bring das immer durcheinander.

del_4901
2011-07-28, 14:17:34
Nö.
Klar geht das man muss es nur beim erzeugen eines Base alias auch gleich zuweisen.

Die Sache ist, das trotzdem kein Polymorphismus vorhanden ist, weil die Klasse dann immer zur Compilierzeit bekannt ist. Ich bring das immer durcheinander.
Noe, die Abgeleitete Referenz kann ja schon ein Alias auf eine weitere Unterklasse sein. Und wenn man bei Funktionen Referenzen uebergibt, dann kann der Compiler auch nicht wissen welchen Typs die eigentlich sind.

Coda
2011-07-28, 14:20:54
Ja, okay. Funktionsaufrufe und so. Ich weiß auch nicht was ich gerade fürn brainfart hatte.

Ich wollt auch schon anmerken, das Referenzen sowieso immer als Pointer implementiert sind und das "sind nur aliase und brauchen keinen Speicher" auch nur Theorie ist.

del_4901
2011-07-28, 14:25:37
Whatever. Das kommt eh so gut wie nie vor.
Naja wenn man Pointer Free programmieren moechte ist das schon sehr praktisch. Ein guter C++ Compiler verbietet naemlich Adressen auf Referenzen. Damit kann man dann so lustige Stack Allocatoren bauen wie DICE und sicher gehen, das sich Niemand geloeschte Pointer halten kann.

Ectoplasma
2011-07-28, 22:09:45
... Dann musst du allerdings mindestens Copy-Constructor und operator= implementieren. Für std::set/map auch noch operator<. Für std::unordered_set/unordered_map soweit ich weiß std::hash.

In der Regel sind der Copy-Constructor und der operator= impliziet vorhanden. Man muss diesen also nicht unbedingt implementieren, da die meisten Objekte sich eh nur wie POCOs verhalten. Bei set/map ist der < operator aber tatsächlich in der Regel zu implementieren.

Coda
2011-07-29, 00:08:20
In der Regel sind der Copy-Constructor und der operator= impliziet vorhanden.
Sobald man Pointer drin hat etc. ist das in der Regel nicht mehr sehr nützlich ;)

Nasenbaer
2011-07-29, 09:10:52
Objekte direkt zu speichern kam nicht in Frage, da diese bereits in nem anderen Container abgelegt wurden.
Falls es jemand genau wissem will: Einmal brauch ich ne Liste von Dreiecken und einmal eine Map, die je Key (Vertex), einen einen vector adjazenter Dreiecke ablegt.

Generell sind mir Rerenzen halt lieber, da man nicht auf NULL testen muss und diese ganzen Smart-Pointer Sachen hab ich mir bisher noch nie angeschaut. :/

Coda
2011-07-30, 13:10:56
Man muss auch Pointer nicht auf 0 testen, wenn man weiß das sie nicht 0 sind ;)

Nasenbaer@Gast
2011-07-30, 14:50:12
Man muss auch Pointer nicht auf 0 testen, wenn man weiß das sie nicht 0 sind ;)
Das ist klar aber sobald man Daten zwischen Klassen austauscht führt eigentlich kein Weg dran vorbei, wenn man einen guten Stil wahren will und mit Referenzen hat man diesen Ärger halt nicht.
Ließen sich die ganzen Libs, die man so braucht, insbesondere DirectX, leicht und Java nutzen, ich wäre schön längst umgestiegen. :D

Coda
2011-07-30, 17:06:37
Es gibt sehr gute DirectX-Wrapper für .NET.

Chris Lux
2011-08-04, 23:59:17
Damit kann man dann so lustige Stack Allocatoren bauen wie DICE und sicher gehen, das sich Niemand geloeschte Pointer halten kann.hast du dafür eine referenz zum nachlesen? thx