Для простой игры у меня есть этот класс, который проверяет, есть ли какие-либо объекты перед игровым объектом.C++: ошибка сегментации при разделении заголовка и файла реализации (.hpp/.cpp)
class FieldOfView : public anax::System<FieldOfView>
{
public:
FieldOfView() :
Base(anax::ComponentFilter().requires<components::Transform, components::FieldOfView>())
{
}
void update()
{
using std::find;
using std::begin;
using std::end;
using std::remove_if;
auto& bus = Game::get().getMessageBus();
for (auto& entity : getEntities())
{
auto collisions = getCollisions(entity);
auto& inSight = entity.getComponent<components::FieldOfView>().inSight;
for (auto& collided : collisions)
{
if (find(begin(inSight), end(inSight), collided) == end(inSight))
{
inSight.push_back(collided);
bus.send<message::EntityEnteredFov>(entity, collided);
}
}
std::function<bool(const anax::Entity&)> hasCollided = [&collisions](const anax::Entity& x) -> bool {
return find(begin(collisions), end(collisions), x) != end(collisions);
};
for (const auto& seenEntity : inSight)
{
if (!hasCollided(seenEntity))
bus.send<message::EntityLeftFov>(entity, seenEntity);
}
inSight.erase(remove_if(begin(inSight), end(inSight), std::not1(hasCollided)), end(inSight));
}
}
};
Этот класс находится в файле "FieldOfView.hpp". Это работает как раз ожидалось. Однако я хочу разделить файл заголовка и реализации, поэтому я создал «FieldOfView.cpp».
void FieldOfView::update()
{
// the same code as above
}
Я также обновил файл заголовка ("FieldOfView.hpp"):
class FieldOfView : public anax::System<FieldOfView>
{
public:
FieldOfView() :
Base(anax::ComponentFilter().requires<components::Transform, components::FieldOfView>())
{
}
void update();
};
Когда этот код (HPP + каст) выполняется, программа прерывает из-за ошибки сегментации (Segmentation fault: 11
) , Ошибка возникает в этой строке:
bus.send<message::EntityLeftFov>(entity, seenEntity);
Когда я скомпилировать и запустить код, используя только одного HPP (нет каст файла) все хорошо, нет никакой ошибки сегментации или любого другого вида ошибки. Я не знаю, что вызывает такое поведение ...
Угадайте, у вас есть проблема в другом месте вашего кода. Проверка переполнения буфера и использования памяти –