It would be different if I didn't use pointers?
Let's say you add an instance of class Soldier to your class MapManager:
class MapManager
{
Soldier mySoldier;
int myMagicInt;
};
In order to know how large MapManager is (how much memory has to be set aside every time an instance of MapManager is created), we need to know all the details of Soldier. Does it just have an int for HP? Does it have 50 floats with all kinds of stats?
In this case, MapManager would need to know both that Soldier exists, and the details of it.
In the case where you have a pointer to it, all you need to know is that it exists (so it understands that "Soldier" is the name of a class and not just random letters). We still need to know how much memory to set aside for the pointer, however, since all pointers are the same size, it doesn't need to know the details of the class. If the class is huge or tiny, the pointer to it will remain the same size.
The reason why you still need to include Soldier.h in the MapManager.cpp file, is because now you're wanting to access the Soldier details -- mySoldier->someFunction().
To access those details, you need to know they exists, hence the reason for the include here.
This also means you can't have 2 classes which have instances of each other inside each other.
In this case, you would need to split things up somehow, so that either 1 class contains a pointer to the other, or to create a new class which contains both of them.