Como a declaração antecipada não é necessária para o conceito de classe de amigo?
Eu aprendi recentemente sobrefriend class
conceito em C ++ (eu pesquisei um pouco, mas esserespond me fez rir até me lembrar das partes mais importantes) e estou tentando incorporá-lo ao projeto em que estou trabalhando agora. A pergunta concisa é destacada no final, mas, em geral, estou confuso com falta completa de declarações avançadas no meu código de trabalho.
Todas as minhas aulas são separadas por (sub-) pastas e cada uma em um .h e .cpp, mas isso deve ser suficiente para ter uma idéia sobre as dependências:
// 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 ¶mFE = 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!
}
Agora, eu tive parte para conseguir tudo isso para realmente compilar com todas as dependências (tive que anotá-lo em um diagrama de classe no final para fazê-lo funcionar), mas agora funciona. O fato de que é realmenteme confundind, é aquelenenhuma declaração avançada era necessária. Conheço as declarações de encaminhamento anteriores e, por precaução, atualizei minha memória comesta resposta.
ntão, para tentar mantê-lo clarminha pergunt: Ao declarar oclass TLS
como amigo, por que não foram necessárias declarações avançadas explícitas? Isso significa que umfriend class
declaração é uma declaração direta em si mesma? Para mim, intuitivamente, falta algo aqui ... E, como ele compila e funciona normalmente, alguém pode ajudar a corrigir minha intuição? : D
PS desculpe por uma introdução tão longa à pergunta e um monte de código. Por favor, não comente meu conceito de código - amigos são bons aqui, tenho certeza de que está correto para o meu projeto atual (é um pouco difícil de ver nesse esqueleto). Gostaria apenas de saber por que nenhuma declaração de encaminhamento foi necessária em qualquer luga