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

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

11

19.02.2012, 20:06

Ok, verstanden hab ich es, aber wüsste jetzt nicht wie ich das machen sollte.
Wie würdest du es denn machen?
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

12

19.02.2012, 20:27

Naja. Objekt 1x anlegen und Zeiger oder Smart Pointers rumreichen, wenn es nicht sinnvoll ist das Objekt kopieren zu können (da müsste man es dann halt richtig implementieren).

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

13

19.02.2012, 20:52

meinst du dann einfach eine Instanz zu erzeugen und diese dann immer in das push_back() zu machen?
Was meinst du mit "wenn es nicht sinnvoll ist, das Objekt kopieren zu können"?
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

14

19.02.2012, 21:16

Der vector verwaltet dann nur die Zeiger der Objekte, welche du dynamisch anforderst (per new).

Es ist nicht immer unbedingt sinnvoll Kopiersemantik eines Objektes zu unterstützen. Ein "Spieler Objekt" sollte z.B nur 1x vorhanden sein und andere Klassen sollte nur als Zeiger darauf Zugriff haben, anstatt das Objekt irgendwie rum zu kopieren. Also macht man die gerade nicht-kopierbar (wie es auch gewisse STL Objekte sind).

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

15

20.02.2012, 13:38

Also ich habs jetzt so gemacht, dass ich das Sprite in der main erstelle und dann einfcah jedem erstellten Mob dieses als zeiger bei der render übergebe.
Wenn ich aber jetzt die erase mit dem iterator aufrufe kommt im Debug der Fehler:

Zitat

Debug Assertion Failed! ... Expression. vector iterator not incrementable


hab jetzt herausgefunden, dass der Iterator durch das erase gelöscht wird, wenn ich aber einen neuen iterator erstelle und dieses auf die stelle des ersten zeigen lasse, klappt es auch nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
for(Iter=vMobs.begin(); Iter<vMobs.end(); Iter++)
        {
            Iter->Move();

            std::vector<CMob>::iterator i = Iter;
            if(Iter->vPosition.x > 1000 || Iter->vPosition.x < 0)
                vMobs.erase(i);
        }

Aber eigentlich müsste es doch so funktionieren, da ja nur der ungebrauchte iterator gelöscht wird.

EDIT: hab jetzt ne lösung gefunden:

C-/C++-Quelltext

1
2
3
4
5
6
7
for(Iter=vMobs.begin(); Iter<vMobs.end(); Iter++)
        {
            Iter->Move();

            if(Iter->vPosition.x > 1000 || Iter->vPosition.x < 0)
                Iter = vMobs.erase(Iter);
        }


Hab nur keine Ahnung wieso das jetzt geht?
Ist das so weil er durch das erasen den voherigen iterator gelöscht hat aber einen neuen returned? oder wie?
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ProAmateur« (20.02.2012, 13:47)


drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

ProAmateur

Alter Hase

  • »ProAmateur« ist der Autor dieses Themas

Beiträge: 434

Wohnort: Bei Simmern, Koblenz

Beruf: Schüler

  • Private Nachricht senden

17

20.02.2012, 13:48

Ja ist das so wie ich es gedacht hab in der letzen edit?
"Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will."
Galileo Galilei
________________________________________________________________________

"Dumme Fragen gibt es nicht, dumm ist nur, wer nicht fragt.“

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

18

20.02.2012, 13:51

Lies doch in einer Referenz nach. Dort steht was es zurück gibt.
http://www.cplusplus.com/reference/

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

19

20.02.2012, 14:48

Du solltest anstelle von "Iter < vMobs.end()" diesen Vergleich nutzen: "Iter != vMobs.end()".
Denn "Iter > vMobs.end()" kann unter keinen Umständen wahr sein. Jetzt wird dir vielleicht auch klar, was dein Problem ist :whistling:
"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?

Werbeanzeige