kann ich um Hilfe bitten, um zu bestätigen, ob mein Problem von einem Design-Problem kommt, oder wenn es würde eine mögliche saubere Lösung für die folgenden sein:„Vector Iteratoren unvereinbar“, wenn sie in einem Selbstversorger-Vektorschleife Löschen
Entity.h
class CLEntity3D
{
public:
CLEntity3D();
virtual ~CLEntity3D();
virtual void update() = 0;
static std::vector<CLEntity3D*> vecEntity;
};
Entity.cpp
int CLEntity3D::nbrEntity = 0;
std::vector<CLEntity3D*> CLEntity3D::vecEntity;
CLEntity3D::CLEntity3D()
{
vecEntity.push_back(this);
}
CLEntity3D::~CLEntity3D()
{
vecEntity.erase((std::remove(vecEntity.begin(), vecEntity.end(), this)), vecEntity.end());
}
verschiedene abgeleitete Klasse erstellen/löschen verschiedene Entitäten durch das Programm-Objekt, das alles funktioniert gut.
In einer Szene Klasse, ich habe die folgenden Methoden:
void CLScene::Update()
{
for (auto& iter : CLEntity3D::vecEntity) {
iter->update();
}
}
void CLScene::ClearScene()
{
for (auto& iter : CLEntity3D::vecEntity) {
delete(iter); iter = nullptr;
}
CLEntity3D::vecEntity.clear();
}
-Update ist in Ordnung, das Problem mit ClearScene ist(). Ich bekomme eine "Vector Iterators Inkompatible" Debug-Assertion.
Aus meiner Forschung scheint das allgemeine Problem zu sein, weil die Iteratoren von verschiedenen Vektoren sind, die ich glaube nicht, ist das Problem hier. Ich denke, das Problem ist, wenn ClearScene() aufgerufen wird, jedes delete (iter) ändert die Größe von vecEntity durch den CLEntity3D-Destruktor und macht daher den Iterator in der ClearScene-Schleife ungültig. Habe ich recht?
Meine Frage wäre dann: Gibt es eine Möglichkeit, alle Clentity3D-Objekte aus CLScene mit diesem Design zu löschen?
Ich glaube, ich könnte CLScene die vecEntity halten, die das Problem beseitigen würde, aber dies würde bedeuten, dass CLScene müssten alle Schöpfung/Löschen von Einheiten verwalten, also nicht so vielseitig sein ...
PS: Ich weiß, dass dieses Beispiel nicht zu kompilieren ist, aber da meine Frage mehr nach Konzept ist ... bitte rate mir, ob ich etwas anderes bereitstellen soll.
Das Problem ist, dass in 'CLEntity3D', Sie' this' zum 'vecEntity' Vektor hinzuzufügen, aber die 'Clentity3D' -Instanz kann dynamisch aufgebaut sein oder auch nicht (zB' Clentity3D entity; 'vs.' Clentity3D * entity = new Clentity3D(); '). Wenn keine dynamische Zuweisung durchgeführt wurde, können Sie 'delete' nicht verwenden. – Holt
Ich glaube, Sie wollten '* iter = nullptr;' anstelle von 'iter = nullptr;' schreiben, wenn Sie den Iterator so ändern, wie er zum nächsten gehen soll? – SHR
@SHR Dies ist eine For-Range-Schleife, die iter-Variable ist eigentlich der Zeiger selbst, nicht der Iterator. – Holt