может я прошу помощи, чтобы подтвердить, если мой вопрос исходит от проблемы проектирования или если бы возможное чистое решение следующее:«Вектор итераторы несовместимыми» при удалении в себе содержал вектор петли
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());
}
различные производный класс создается/удаление различных сущностей объекта с помощью программы, это все работает нормально.
В классе сцены, у меня есть следующие методы:
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 нормально, проблема с ClearScene(). Я получаю сообщение об ошибке «Нетерапевтические итераторы».
Из моих исследований, общая проблема, похоже, связана с тем, что итераторы - это разные векторы, о которых я не думаю, здесь проблема. Я думаю, что проблема заключается в том, когда вызывается ClearScene(), каждый delete (iter) изменяет размер vecEntity через деструктор CLEntity3D, поэтому делает недействительным итератор в цикле ClearScene. Я прав?
Мой вопрос будет тогда: Есть ли способ удалить все объекты CLEntity3D из CLScene с этим дизайном?
Я предполагаю, что я мог бы CLScene проведение vecEntity, который позволит устранить эту проблему, но это означало бы, что CLScene бы управлять всеми создание/удаление сущностей, поэтому не будучи столь же универсальны ...
PS: Я знаю, что этот пример не является компиляцией, но поскольку мой вопрос больше о концепции ..., пожалуйста, сообщите, если я предоставлю иначе.
Проблема заключается в том, что в 'CLEntity3D', добавьте' this' в 'vecEntity' вектор, но экземпляр 'CLEntity3D' может или не может быть построен динамически (например,' CLEntity3D entity; 'против' CLEntity3D * entity = new CLEntity3D(); '). Если динамическое распределение не выполнялось, вы не можете использовать 'delete'. – Holt
Я думаю, вы хотели написать '* iter = nullptr;' вместо 'iter = nullptr;', если вы измените итератор, как он должен перейти к следующему? – SHR
@SHR Этот цикл 'for-range', переменная' iter' на самом деле является самим указателем, а не итератором. – Holt