Недавно я узнал о концепции friend class
в С++ (я немного искал язык, но этот ответ заставлял меня смеяться, пока я не вспомнил наиболее важные части), и я пытаюсь включить его в проект, над которым я сейчас работаю. Конкретный вопрос выделен в конце, но в целом я смущен полным отсутствием форвардных деклараций в моем рабочем коде.
Все мои классы разделяются через (под) папки и каждый в отдельный файл .h и .cpp, но этого должно быть достаточно, чтобы получить представление о зависимостях:
// 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!
}
Теперь у меня была вечеринка, которая собирала все это для компиляции со всеми зависимостями (пришлось записать ее на диаграмму классов, чтобы она работала), но теперь это происходит. Тот факт, что на самом деле меня сбивает с толку, заключается в том, что передовые декларации не нужны. Я знаю о форвардных объявлениях ранее, и на всякий случай я обновил свою память с помощью этого ответа.
Итак, чтобы попытаться сохранить это ясно, мой вопрос:
При объявлении class TLS
в качестве друга, почему нет явных форвардных деклараций? Означает ли это, что декларация friend class
является декларацией о переходе в нее? Для меня, интуитивно, чего-то здесь не хватает... И поскольку он компилируется и работает нормально, может кто-то помочь исправить мою интуицию?: D
PS извините за такое длинное введение в вопрос и кучу кода. Пожалуйста, не комментируйте мою концепцию кода - друзья здесь хороши, я уверен, что это правильно для моего текущего проекта (это немного сложно увидеть из этого скелета). Я просто хотел бы знать, почему в любом месте не было необходимости в форвардной декларации.