To understand the difference, you must understand why the compiler need the include in the first place.
The compiler must know the size of each class you declare. Thus it has to know the size of each member you added to the class. In the case of a non-pointer non-built-in member, the compiler has to see the definition of that member class, which is usually in a header that you must include. In the case of a pointer though, the compiler doesn't have to see the whole definition because whatever its type, a pointer is always of the same size on a given platform (usually 32 or 64 bits). So when the member is a pointer, the compiler only has to know the name, which can be done through forward declaration, i.e.
class AnotherClass;
Now, which one to use?
Keeping it short: Use forward declaration when you can, include when you must.
If your header can do fine with a forward declaration, you'll decrease your overall compilation time, because each header you include will have to be processed in every translation unit that contains it.
A common scheme is to forward declare in the header, and include the corresponding class in the associated .cpp
.