Cómo no se necesita una declaración para el concepto de clase de amigo?

Acabo de enterarme recientemente defriend class concepto en C ++ (he buscado en Google un poco, pero esteresponde me hizo reír hasta que recordé las partes más importantes), y estoy tratando de incorporarlo al proyecto en el que estoy trabajando en este momento. La pregunta concisa se destaca al final, pero en general, estoy confundido por falta completa de declaraciones a futuro en mi código de trabajo.

Todas mis clases están separadas a través de (sub) carpetas y cada una en una .h y .cpp file, pero esto debería ser suficiente para tener una idea de las dependencias:

// FE.h - no implementations - no .cpp file
class FE
{
    private:
       virtual void somePrivateFunc() = 0;
    // 90% virtual class, interface for further implementations
    friend class TLS;
};

// DummyFE.h
#include "FE.h"
class DummyFE :: public FE {
    /* singleton dummy */
    private:
        // constructor
    public:
        static DummyFE& instance();
};
// DummyFE.cpp
#include "DummyFE.h"
// all Dummy FE implementation

// ImplFE.h
#include "FE.h"
class ImplFE :: public FE { /* implemented */ };
// ImplFE.cpp
#include "FE.cpp"
// all Impl FE implementations


// SD.h - implements strategy design pattern
//        (real project has more than just FE class in here)
#include "FE.h"
#include "DummyFE.h"
class SD
{
    private:
        FE &localFE;
    public:
        SD(FE &paramFE = DummyFE::instance());
    // ... and all the other phun stuff ... 
    friend class TLS;
};
// SD.cpp - implementations
# include "SD.h"
/* SD implemented */

// TLS.h - implements strategy design pattern
           (on a higher level)
#include SD.h
class TLS{
    private:
        SD *subStrategy;
    public:
        void someFunctionRequiringFriendliness();
}

// TLS.cpp - implementations
#include "TLS.h"
void TLS::someFunctionRequiringFriendliness(){
    this->subStrategy->localFE.somePrivateFunc(); // ok!
}

Ahora, he tenido fiesta haciendo que todo esto se compile con todas las dependencias (tuve que escribirlo en un diagrama de clase al final para que funcione), pero ahora lo hace. El hecho de que en realidad esMe confund, es esono se necesitaban declaraciones a futuro. Sé sobre las declaraciones futuras de antes, y por si acaso, actualicé mi memoria conesta respuesta.

Entonces, para tratar de mantenerlo claro,mi pregunt: Al declarar laclass TLS como amigo, ¿por qué no se necesitaban declaraciones explícitas? ¿Eso significa que unafriend class declaración es una declaración directa todo en sí mismo? Para mí, intuitivamente, falta algo aquí ... Y como se compila y funciona normalmente, ¿alguien puede ayudarme a corregir mi intuición? :R

PS lo siento por una introducción tan larga a la pregunta y un montón de código. Por favor, no comente sobre mi concepto de código: los amigos son buenos aquí, estoy bastante seguro de que es correcto para mi proyecto actual (es un poco difícil de ver desde este esqueleto). Solo me gustaría saber por qué no se necesitaba una declaración directa en ninguna parte.

Respuestas a la pregunta(8)

Su respuesta a la pregunta