Ich habe gerade über friend class
Konzept in C++ (Ich habe für ein bisschen gegoogelt, aber diese answer brachte mich zum Lachen, bis ich die wichtigsten Teile erinnerte), und ich versuche, es in das Projekt zu integrieren Daran arbeite ich gerade. Die kurze Frage wird am Ende ausgesondert, aber im Allgemeinen bin ich verwirrt durch vollständigen Mangel an Vorwärtsdeklarationen in meinem Arbeitscode.Wie wird die Deklaration für das Friend-Class-Konzept nicht benötigt?
Alle meine Klassen werden durch (Teil-) Ordner getrennt und jeder in einem separaten .h und CPP Datei, aber das sollte genug sein, ein Gefühl zu Abhängigkeiten erhalten:
// 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!
}
Jetzt hatte ich Party all dies mit allen Abhängigkeiten tatsächlich zu kompilieren (musste es in ein Klassendiagramm am Ende schreiben, um es funktionieren zu lassen), aber jetzt tut es. Die Tatsache, dass ist eigentlich verwirrend mich, ist, dass keine Vorwärtsdeklarationen benötigt wurden. Ich weiß über Vorwärtsdeklarationen von früher, und nur für den Fall, ich habe mein Gedächtnis mit this answer aktualisiert.
Also, um zu versuchen und zu halten es klar, meine Frage: Wenn die class TLS
als Freund erklärt, wie wurden keine expliziten vorwärts kommen Erklärungen benötigt? Bedeutet das, dass eine friend class
Deklaration eine Forward-Deklaration ist? Für mich fehlt hier intuitiv etwas ... Und da es kompiliert und normal funktioniert, kann jemand helfen, meine Intuition zu korrigieren? : D
PS Entschuldigung für solch eine lange Einführung in die Frage und eine Reihe von Code. Bitte kommentieren Sie nicht mein Code-Konzept - Freunde sind hier gut, ich bin mir ziemlich sicher, dass es für mein aktuelles Projekt korrekt ist (es ist nur ein bisschen schwer von diesem Skelett zu sehen). Ich möchte nur wissen, warum nirgendwo eine Vorwärtsdeklaration benötigt wurde.
Hm. Seltsam. Ich habe gerade die Situation, die Sie gesagt haben * kompiliert nicht in meiner Version des Codes (es spiegelt sich hier durch die Tatsache wider, dass FE TLS nicht weiterleitet, oder es überhaupt einschließt) - und es funktioniert! Das verwirrt mich! Ah, und ich habe gerade bemerkt, dass du die Syntax 'Freund A' anstelle von 'Freund Klasse A' benutzt hast. Könntest du das weiter ausführen, habe ich versehentlich die Forward- und Friend-Deklaration in eine zusammengefasst? – penelope
Hinweis: Das erste Snippet wird in C++ 03 (für diejenigen, die C++ 11 noch nicht verwenden können) nicht kompiliert. Das zweite Snippet kompiliert nicht mit g ++ 4.5 oder clang ++ 3.0 (selbst im C++ 11-Modus). –
@Luchian Ich bin verwirrt, wie Sie Ihr zweites Beispiel kompiliert haben? Dies veranlasste mich, diese Frage zu stellen, die darauf hinweist, dass Ihr zweites Beispiel nicht kompilieren sollte: http://stackoverflow.com/questions/14114956/friend-declaration-not-forward-declaring – JaredC