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

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

11

27.08.2010, 22:03

schau dir mal std::pair an.
das kannst du dann auch gleich einer map übergeben die dir das ordnet und eine schnellere suche ermöglicht.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

12

27.08.2010, 22:10

Ok, vielen Dank. Das schaut schon ma gut aus. Werds mal ausprobieren.


EDIT:

Habs jetzt mit std::pair umgesetzt. Gleicher Fehler bleibt bestehen. Debuger zeigt mir, dass die std::pair's in Ordnung sind.

Quellcode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
list<pair<unsigned int, sf::String*>>   m_listMenuEntries;


MenuHostGame.first = 0;
MenuHostGame.second = new sf::String("Start Game", *m_pFont, 24.0f);
MenuHostGame.second->SetPosition(133.7f, 123.4f);

m_listMenuEntries.push_back(MenuStartGame);



Hat jemand sonst eine Idee woran es liegen könnte? Muss ich trotz Deklaration der Liste im private-Bereich der Klasse an irgendeiner anderen Stelle etwas tun, damit push_back() funktionieren kann?


EDIT 2:

So, ich habe es jetzt endlich lösen können. Es lag an meinem Konstruktor. Da habe ich mich an den Beispielen aus den Büchern orientiert...

C-/C++-Quelltext

1
inline CMenu() { ZeroMemory(this, sizeof(CMenu)); }


... und der macht eindeutig Probleme. Mir war so als gebe es in der Hinsicht unterschiedliche Geschmäcker. Welche Vor- bzw. Nachteile hat ein solcher Konstruktor?!

Danke noch mal an euch für die Antworten!

Gruß
SaRu_

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »SaRu« (28.08.2010, 01:31)


13

28.08.2010, 13:30

ja, weil du damit die liste nullst.
der Ablauf bei der erzeugung eines objekts ist:
- aufruf von Basisklassenkonstruktoren (ggf. mit parametern aus der initialisierungsliste)
- aufruf von memberkonstruktoren (ggf. mit parametern aus der initialisierungsliste)
- ausführen des funktionsrumpfes des konstruktors der eigentlichen klasse

Wenn du jetz im Konstruktor ZeroMemory ausführst, überschreibst du damit ja das komplette objekt mit nullen, unter anderem auch die Liste. Damit zerstörst du ihre verwaltungsdaten, und damit kann sie dir dann auch keinerlei gültige iteratoren oder so geben. ZeroMemory kannst du an sich nur verwenden, wenn du nur primitive datentypen als member, einschließlich derer sämtlicher basisiklassen, und keine polymorphie hast.

14

28.08.2010, 17:09

Hallo PCShadow,

danke für deine Antwort!
ZeroMemory kannst du an sich nur verwenden, wenn du nur primitive datentypen als member, einschließlich derer sämtlicher basisiklassen, und keine polymorphie hast.
Ok und welchen Vorteil würde mir ZeroMemory in solch einem Fall dann bringen? Weshalb wird solch ein Konstruktor bei den Spielen im Buch verwendet?

Gruß
SaRu_

15

28.08.2010, 18:53

Ich habe keine Ahnung, warum er bei den spielen im buch verwendet wird. Wo man ZeroMemory z.B. gut verwenden kann, ist bei den Lichtparametern für die DX9-FPU, weil da nicht genullte angaben, die für den jeweiligen lichttyp nicht gebracuht werden, afair zu artefakten führen können. Aber bei selbstgeschreibenen kalssen macht ZeroMemory imo auch wenn man es verwenden könnte nciht unbedingt sinn, wofür gibt's schließlich initialisierungslisten?

Werbeanzeige