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

1

10.10.2015, 15:01

[C++] Problem mit löschen v. Objekt einer Liste vom Typ unique_ptr<...>

Hallo,
ich habe ein Problem mit list.
Meine Handler-Klasse soll in der Lage sein, Objekte aus einer Liste(unique_ptr<GameObject>) zu entfernen.
Doch wie stelle ich dies an?

Handler.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
#include "includes.h"
#include "GameObject.h"
class Handler{
public:
    list<unique_ptr<GameObject>> List;
public:
    Handler();
    ~Handler();
     void render();
    void tick();
    void addObject(unique_ptr<GameObject> o);
    void removeAll();
};


Handler.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "Handler.h"
Handler::Handler()
{
}
Handler::~Handler()
{
}
void Handler::render() {
    for (list<unique_ptr<GameObject>>::iterator it = List.begin(); it != List.end(); it++) {
        (*it)->render();
    }
}
void Handler::tick() {
    for (list<unique_ptr<GameObject>>::iterator it = List.begin(); it != List.end(); it++) {
        (*it)->tick();
    }
}

void Handler::addObject(unique_ptr<GameObject> o) {
    List.push_back(move(o));
}
void Handler::removeAll(){
    for (list<unique_ptr<GameObject>>::iterator it = List.begin(); it != List.end(); it++) {
        it = List.erase(it);
    }
}


Das Problem: list iterator not incrementable.

2

10.10.2015, 16:33

Wenn du eh die ganze Liste leeren willst, wie wäre es mit list::clear()?

Schau dir mal an was die Erease-Funktion macht (auf welches Element der Iterator dann zeigt), vielleicht machts dann Klick.
Hier mal noch paar bsp. wie es geht.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Koschi« (10.10.2015, 16:45)


3

23.10.2015, 15:23

Hallo,
ich habe ein Problem mit list.
Meine Handler-Klasse soll in der Lage sein, Objekte aus einer Liste(unique_ptr) zu entfernen.
Doch wie stelle ich dies an?

Handler.h

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
#include "includes.h"
#include "GameObject.h"
class Handler{
public:
    list> List;
public:
    Handler();
    ~Handler();
     void render();
    void tick();
    void addObject(unique_ptr o);
    void removeAll();
};


Handler.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include "Handler.h"
Handler::Handler()
{
}
Handler::~Handler()
{
}
void Handler::render() {
    for (list>::iterator it = List.begin(); it != List.end(); it++) {
        (*it)->render();
    }
}
void Handler::tick() {
    for (list>::iterator it = List.begin(); it != List.end(); it++) {
        (*it)->tick();
    }
}

void Handler::addObject(unique_ptr o) {
    List.push_back(move(o));
}
void Handler::removeAll(){
    for (list>::iterator it = List.begin(); it != List.end(); it++) {
        it = List.erase(it);
    }
}


Das Problem: list iterator not incrementable.

Hallo,

deine Frage ist für mich nicht eindeutig. Versuch es mal mit dem Variablen-Typ auto(cpp-v11):
auto id = t.begin();

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

23.10.2015, 15:32

auto hilft ihm da auch nicht weiter. Aber in da Koschi ihm im Prinzip den richtigen Hinweis gegeben hat und hier seit knapp 2 Wochen nichts passiert ist gehe ich davon aus dass das Problem gelöst wurde.
„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.“

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

5

23.10.2015, 15:33

Wenn du ein einzelnes Objekt löschen willst musst du es eindeutig identifizieren. Z.B. mit Hilfe einer ID.

Achja, wenn du keinen Grund hast list zu verwenden, solltest du vector nutzen. Der ist in der Regel ressourcensparender.
Ausserdem solltest du die groß- und kleinschreibung deiner Bezeichner einheitlich halten. Hast du da ein System? Überlege dir ob es vielleicht besser wäre Methoden und Klassen mit einem großen Buchstaben und Variablen mit einem kleinen Buchstaben beginnen zu lassen. Dann weißt du immer sofort was Sache ist. Das ist aber "Geschmackssache" und daher nur ein Vorschlag.
"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