>source

좋습니다. 저는 벡터의 모든 객체를 반복하는 루프의 중간에 있습니다.

for (auto &itr : m_entities) {
    itr.second->Update(l_time);
    if (itr.second->m_isDead) 
        Remove(itr.first); //don't worry, it does not remove immediately so the vector size wont change 
    }

m_entities 기본 클래스에서 상속 된 파생 객체를 처리하는 벡터이며 루프는 단순히 Update() 그 벡터에있는 각 객체의 함수. 충분히 간단하고 모든 것이 잘 작동했습니다.

그러나 내가 전화하기로 결정했을 때 Add() 단순히 벡터에 새 객체를 추가하는 함수를 사용하면 예외가 발생합니다.

_Myval2 was 0xDDDDDDDD

나는 문제를 안다. 나는 Add() 내부 기능 Update() 반복을 수행하면서 벡터의 크기를 변경하는 파생 클래스 중 하나의 함수입니다. 이렇게 :

for (auto &itr : m_entities) {
    itr.second->Update(l_time); //here is where I call "Add," changing the size of the vector  
    if (itr.second->m_isDead)   //and messing everything up
        Remove(itr.first);
}

그래서 내 질문은 : 어떻게 벡터에 추가 할 수 있습니까?내부오류없이 루프를 완료 할 수 있습니까?

추신 : 루프 내부에 추가해야합니다. 내가 원하는 기능은 내가했던 것처럼 작동하지 않습니다. Remove() 함수. 그만큼 Remove() 함수는 나중에 벡터에서 삭제 될 벡터로 엔티티의 ID 만 푸시합니다. 예, 이렇게하면 Add() 함수이지만 루프 내부에 엔티티를 추가하자마자 수정하고 싶습니다.

if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
    if (...) {
        ...
        //Here it will add to the vector and return the entity ID, which 
        //I use to find the entity and modify it right away
        unsigned int bulletId = m_entityMgr->Add(EntityType::Bullet);
        //just a pointer to the newly added entity so I can modify it
        Bullet *bullet = (Bullet*)m_entityMgr->Find(bulletId);
        ... //modifying entity
    }
}

그리고 이것에서 나온 직후 Update() 함수를 사용하면 해당 루프로 돌아가고 벡터의 크기가 수정 되었기 때문에 오류가 나타납니다.

  • 답변 # 1

    범위 기반 for 루프, 컨테이너의 크기를 수정하는 작업을 수행 할 수 없습니다. 이 경우 요소 만 추가하는 것이므로 기존의 인덱스 기반 for 대신 루프, 예 :

    for (size_t i = 0; i < m_entities.size(); ++i)
    {
        auto &itr = m_entities[i];
        itr.second->Update(l_time); // may increase the size of the vector
        if (itr.second->m_isDead)
            Remove(itr.first);
    }
    
    

    또는 전화하고 싶지 않은 경우 Update() 추가 된 새 항목 :

    size_t size = m_entities.size();
    for (size_t i = 0; i < size; ++i)
    {
        auto &itr = m_entities[i];
        itr.second->Update(l_time); // may increase the size of the vector
        if (itr.second->m_isDead)
            Remove(itr.first);
    }
    
    

  • 이전 c# - Xamarin의 이벤트 및 대리자 양식 부모 및 자식 페이지
  • 다음 node.js - 동일한 배열 필드에 많은 업데이트 연산자 적용