对于一个简单的游戏我有这个类,它会检查游戏实体前面是否有任何对象。
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 + cpp)时,程序因分段错误(Segmentation fault: 11
)而中止。此行中出现错误:
bus.send<message::EntityLeftFov>(entity, seenEntity);
当我使用单个hpp(没有cpp文件)编译和运行代码时,一切都很好,没有分段错误或任何其他类型的错误。我不知道是什么导致了这种行为......
答案 0 :(得分:0)
旧,但是:bus
是否引用Game
的静态成员?好像。如果是这种情况,您将对&#34; static initialisation order fiasco&#34;因此,不同的.cpp文件可能会实例化它们自己的静态变量,与其他试图访问它们的对象相比,它们可能在它们准备就绪之前无序。
来源:它刚好发生在我身上。我有一个静态const数据集,以及一个指向该数据的指针的静态容器。在不同的翻译单元中定义这些导致了一个模糊的段错误,我原则上理解这一点,但是不会浪费时间来弄清楚确切的机制原因。因此,我将有问题的实例化移动到一个单独的cpp文件中,将它们按照正确的依赖顺序放置,一切都很好。