Forward declaration as explained in Rama’s wiki is how I’ve always done it, and the primary reason for doing that (e.g. class MyClass; in the header) was to avoid circular dependencies. I’m not sure if the UE4 way of doing forward declarations is “better”, but it does bring the declaration to where it is used - which I like.
Remember that a forward declaration only works when members of the class (including constructor/destructor) are not used. This is not much of a problem since it is used in headers, but limits use to pointers (including TSubclassOf). So writing class MyClass ClassInstance* will work, but writing class MyClass ClassInstance will invoke the constructor and since that has not been defined by the forward declaration it will not work. Please correct me if that is in any way not correct.
Now, is there any reason NOT to use this type of forward declaration everywhere as a convention (as seems to be the case)?