That is a circular inclusion. You'll need to forward declare one of the types and not include the other header file in one of them. As an extension to this, you must only use a pointer to the type within that header. E.g.,
2 #define MOB_HPP
4// Forward declare World. DON'T include Mob header file.
14 * We know there is a World class. That's all we need to know for a
15 * pointer to it.
17 void move(int, int, Player *, World *);
2 #define WORLD_HPP
4 // DO include Mob header.
5 #include "Mob.hpp"
13 // We know what 'Mob' is; no problem.
14 std::list<Mob> mobs_;
2 * NOW we need to know what a World actually is. Include the World header
3 * file from Mob source file.
10void Mob::move(int x, int y, Player * player, World * world)
12 // We know what 'World' is where it counts.
1// No need for Mob header. Already included in World header.
Something like that anyway... Somebody should extend the Wiki article with the solution for circular inclusion if it doesn't already explain it. There are limitations, of course. You can't actually use World objects within the Mob header because in the Mob header we don't necessarily know what a World object actually is yet.
All that said, you might find that you don't want a list of Mob objects. For that to work reliably, your Mob type must follow the rules for a proper object, and even then it might be a good waste creating and destroying objects as the list is manipulated. I'm not really an expert on the STL or C++ in general. In any case, if you store pointers, it's inexpensive to manipulate the list, and you know it won't break anything. You do have to worry about managing pointers though. So you might prefer the best of both worlds; a list of smart pointers.
And as I've mentioned in another thread, you might opt to not have the Mob know about the World at all, which will eliminate this whole problem.