Niedawno dowiedziałem się o koncepcji friend class
w C++ (trochę googlowałem, ale ta answer rozśmieszyło mnie, dopóki nie przypomniałem sobie najważniejszych części) i próbuję włączyć to do projektu Pracuję teraz. Na końcu zwięzłe pytanie jest wyróżnione, ale ogólnie jestem zdezorientowany przez kompletny brak przyszłych zgłoszeń w moim działającym kodzie.W jaki sposób deklaracja przyszłości nie jest potrzebna w przypadku koncepcji klasy przyjaciół?
Wszystkie moje zajęcia są oddzielone przez (pod) folderów, a każdy z nich w oddzielnym .h i .cpp pliku, ale to powinno wystarczyć, aby uzyskać wrażenie o zależności:
// 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!
}
Teraz, miałem imprezę, zbierając to wszystko, aby faktycznie skompilować wszystkie zależności (musiałem to zapisać na diagramie klasy, aby to działało), ale teraz to robi. Fakt, że w rzeczywistości mylące mnie, jest to, że nie były potrzebne deklaracje forward. Wiem o wcześniejszych deklaracjach forward i na wszelki wypadek odświeżyłem swoją pamięć this answer.
Tak, aby spróbować zachować to jasne, moje pytanie: Podczas deklarowania class TLS
jako przyjaciela, to dlaczego były potrzebne żadne wyraźne deklaracje forward? Czy to oznacza, że deklaracja friend class
jest deklaracją naprzód w niej samej? Dla mnie intuicyjnie czegoś tu brakuje ... A skoro kompiluje się i działa normalnie, czy ktoś może poprawić moją intuicję? : D
PS przepraszam za tak długie wprowadzenie do pytania i garść kodu. Proszę nie komentować mojej koncepcji kodu - przyjaciele są tutaj dobrzy, jestem prawie pewien, że to jest poprawne dla mojego obecnego projektu (jest to trochę trudne do zobaczenia z tego szkieletu). Chciałbym tylko wiedzieć, dlaczego nigdzie nie potrzebna była żadna deklaracja.
Hm. Dziwne. Mam taką sytuację, którą powiedziałeś * nie * kompiluje się w mojej wersji kodu (znajduje to tutaj odzwierciedlenie w fakcie, że FE nie przekazuje dalej deklarowania TLS, lub włącza go w ogóle) - i to działa! To mnie myli! Ach, a także, zauważyłem, że użyłeś składni "przyjaciel A" zamiast "przyjaciel klasy A". Czy mógłbyś to rozwinąć, czy przypadkiem udało mi się scalić deklarację napastnika i przyjaciela w jeden? – penelope
Uwaga: Pierwszy fragment kodu nie zostanie skompilowany w C++ 03 (dla tych, które nie mogą jeszcze używać C++ 11). Drugi fragment nie kompiluje się z g ++ 4.5 lub clang ++ 3.0 (nawet w trybie C++ 11). –
@Luchian Jestem zdezorientowany, jak skompilowałeś swój drugi przykład? To skłoniło mnie do zadawania tego pytania, które wydaje się wskazywać na twój drugi przykład nie powinien się kompilować: http://stackoverflow.com/questions/14114956/friend-declaration-not-forward-declaring – JaredC