Acabo de enterarme del concepto friend class
en C++ (he buscado en Google un poco, pero este answer me hizo reír hasta que recordé las partes más importantes), y estoy tratando de incorporarlo en el proyecto Estoy trabajando en este momento. La pregunta concisa se destaca al final, pero en general, estoy confundido por falta completa de declaraciones de envío en mi código de trabajo.¿Cómo se presenta la declaración no es necesaria para el concepto de clase amigo?
Todas mis clases están separados por carpetas (sub) y cada uno en un archivo separado .h y .cpp, pero esto debería ser suficiente para hacerse una idea acerca 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 ¶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!
}
Ahora, he hecho 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 es confundiéndome, es que no se necesitan declaraciones hacia adelante. Sé de declaraciones anticipadas de antes, y por si acaso, actualicé mi memoria con this answer. Por lo tanto, para tratar de mantener en claro,
mi pregunta: Al declarar la class TLS
como un amigo, ¿cómo es que no se necesitaban declaraciones adelantadas explícitas? ¿Eso significa que una declaración friend class
es una declaración directa en sí misma? Para mí, intuitivamente, falta algo aquí ... Y dado que compila y funciona normalmente, ¿alguien puede ayudar a corregir mi intuición? : D
PD. Disculpe por la larga introducción a la pregunta y un montón de código. Por favor, no comenten 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 ningún lado.
Hm. Extraño. Tengo la situación que usted dijo * no * compila en mi versión del código (se refleja aquí por el hecho de que FE no reenvía declarar TLS, o incluirlo en absoluto) - ¡y funciona! ¡Eso es lo que me está confundiendo! Ah, y también, me acabo de dar cuenta de que usaste la sintaxis 'amigo A' en lugar de 'amigo clase A'. ¿Podrías ampliar eso? ¿Conseguí accidentalmente fusionar la declaración directa y la de amigo en una sola? – penelope
Nota: El primer fragmento no se compilará en C++ 03 (para aquellos que aún no pueden usar C++ 11). El segundo fragmento no se compila con g ++ 4.5 o clang ++ 3.0 (incluso en el modo C++ 11). –
@Luchian ¿No entiendo cómo compiló su segundo ejemplo? Esto me llevó a hacer esta pregunta que parece indicar que su segundo ejemplo no debería compilarse: http://stackoverflow.com/questions/14114956/friend-declaration-not-forward-declaring – JaredC