Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TalvinEx

Frischling

  • »TalvinEx« ist der Autor dieses Themas

Beiträge: 28

Wohnort: NRW

  • Private Nachricht senden

1

26.07.2016, 21:38

pair für die map als Attribut oder nicht?

Guten Abend Leute,

ist eher ne kleine Frage, aber interessiert mich gerade:
Wenn ich in einer Klasse A eine std::map nutze und in diese Objekte einer anderen Klasse B reinlade in einer Memberfunktion der Klasse A, sollte ich dann das entpr. pair als Attribut von A anlegen und in der Memberfunktion lediglich neue Werte zuweisen oder in der Funktion neu anlegen und direkt initialisieren?

( m_pair = std::make_pair(int, B)
oder
std::pair<int, B> tempPair = std::make_pair (int, B)
)

Grüße,

Tim
"Gewinner haben keine Angst vor dem Verlieren, nur Verlierer"
(~ein weiser Mann)

xardias

Community-Fossil

Beiträge: 2 731

Wohnort: Santa Clara, CA

Beruf: Software Engineer

  • Private Nachricht senden

2

26.07.2016, 22:48

Ich verstehe die Frage irgendwie nicht so ganz.

Wenn du den Wert den du in der Funktion benutzt spaeter verwenden moechtest, dann speicher den als member variable. Wenn nicht, dann nicht.
Ich bin auch etwas verwirrt was das mit std::make_pair(int, B) sein soll.

Ich glaube ein kompletteres Beispiel waere hilfreich ;)

TalvinEx

Frischling

  • »TalvinEx« ist der Autor dieses Themas

Beiträge: 28

Wohnort: NRW

  • Private Nachricht senden

3

27.07.2016, 07:18

gespeichert wird ja alles in der map, die eine membervariable ist, das pair ist ja so oder so nur temporär bis auf das letzte pair, das ich in die map lade, das als membervariable dann bestehen bleiben würde.

für int und B muss man sich halt echte werte vorstellen bei dir, also z.B. (4, Instanz_der_Klasse_B)
"Gewinner haben keine Angst vor dem Verlieren, nur Verlierer"
(~ein weiser Mann)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

27.07.2016, 09:06

Das sollte keinen Unterschied machen, also nimm dir Variante ohne Zwischenspeichern. Willst du eigentlich wirklich komplette Instanzen der Klasse B in der Map speichern oder nicht lieber (Smart-)Pointer darauf?

TalvinEx

Frischling

  • »TalvinEx« ist der Autor dieses Themas

Beiträge: 28

Wohnort: NRW

  • Private Nachricht senden

5

27.07.2016, 16:28

was ist denn der vorteil von smart-pointern?
hab mich damit noch garnicht beschäftigt, bin grade dabei move semantics zu verstehen, damit ich B nen move-constructor geben kann, weil ich die original instanz von B eh nicht brauche in dem Fall.
wenn smart pointer besser sind könnt ich mir die ja auchnoch anschauen, wenn es mit dem move endlich geklappt hat.
"Gewinner haben keine Angst vor dem Verlieren, nur Verlierer"
(~ein weiser Mann)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

27.07.2016, 16:37

Smart-Pointer nehmen dir u.a. die lästige und fehleranfällige Arbeit ab, dafür zu sorgen, dass ein Objekt wieder gelöscht wird, wenn es nicht mehr gebraucht wird.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

27.07.2016, 17:22

Das Prinzip um welches ist geht ist RAII. Guck dir den Wikipedia Artikel einfach mal an und dir sollte klar werden worum es geht und was das soll. Um das jetzt zu erreichen sind zum Beispiel Klassen wie std::vector ziemlich praktisch, da diese genau dieses Prinzip umsetzen. Die dynamische Speicherallokation und die Freigabe wird in die Klasse gekapselt. Smart Pointer sind Klassen die dieses Prinzip auf Zeiger übertragen. Da gibt es dann allerlei verschiedene Smart Pointer für verschiedene Anwendungsfälle. In fast allen Fällen wirst du std::unique_ptr benötigen. Dies ist eine Klasse die einen Zeiger kapselt und keinen Kopierkonstruktor besitzt. Der Zeiger darf nicht kopiert werden und somit ist er nur 1 mal vorhanden. Man muss sich also um Besitz Gedanken machen. An welcher Stelle wird der Zeiger gespeichert und wer besitzt ihn dadurch am Ende. Versuch einfach möglichst keine normalen Zeiger zu verwenden sondern immer auf Smart Pointer zurück zu greifen. Dann gewöhnst du dir direkt einen saubereren Stil an. Zusätzlich interessant ist, du darfst den Zeiger zwar nicht kopieren da ansonsten zwei Besitzer auf den selben Speicher zeigen würden, du darfst ihn aber verschieben. Und hier kommt move ins spiel. Du kannst zum Beispiel eine Funktion schreiben die einen std::unique_ptr erzeugt und zurück gibt. Beim zurück geben rufst du std::move auf und somit wird der Verschiebekonstruktor dabei genutzt. Dadurch verschiebst du den Zeiger dann aus der Funktion zum Aufrufer. Das heißt, Smartpointer sind an sich auch eine schöne Sache um sich mal mit move auseinander zu setzen. Hier siehst du erst mal wie du das ganze verwendest. Danach kannst du dann mal gucken wie du selbst Verschiebekonstruktoren implementierst.

Schlagworte die du suchen kannst:
RAII,
std::vector,
std::unique_ptr,
std::make_unique,
std::move,
Kopierkonstruktor,
Verschiebekonstruktor

Damit solltest du dich erst mal ein wenig beschäftigen können. Ansonsten geht es aber einfach darum ein sauberes Prinzip beim Entwickeln zu nutzen. Du solltest also versuchen zu verstehen was das ganze soll und danach versuchst du es einfach zu benutzen. Das macht am Anfang sicherlich ein paar kleinere Probleme, wird aber schnell in Fleisch und Blut übergehen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

TalvinEx

Frischling

  • »TalvinEx« ist der Autor dieses Themas

Beiträge: 28

Wohnort: NRW

  • Private Nachricht senden

8

27.07.2016, 21:01

Danke, ich werd die genannten Schlagwörter mal nachschlagen. Bin gerade dabei das Buch "Der C++ Programmierer" von Ulrich Breyman durchzuarbeiten, hoffe danach hab ich nen besseren Überblick über das ganze Thema.

Was ich aber im Moment noch nicht verstehe:
Mir wurde letztens gesagt Objekte sollten nach Möglichkeit auf dem Stack leben, ich nehme mal an smartptr nutzen ebenfalls den Heap? Was ist dann der Vorteil von smartptr gegenüber einfachen Stack-Objekten, um deren Löschung ich mir doch eh keine Gedanken machen muss? ?(
"Gewinner haben keine Angst vor dem Verlieren, nur Verlierer"
(~ein weiser Mann)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

27.07.2016, 21:09

Du kannst halt nicht alles auf dem Stack machen. Sobald der Scope verlassen wird, in dem es erzeugt wurde, ist ein Stack-Objekt ja wieder weg.

Werbeanzeige