Я только недавно узнал о friend class
концепции в C ++ (я немного погуглил, но этот ответ заставил меня смеяться, пока я не вспомнил самые важные части), и я 'Я пытаюсь включить это в проект, над которым я сейчас работаю.Краткий вопрос выделен в конце, но в целом меня смущает полное отсутствие предварительных объявлений в моем рабочем коде.
Все мои классы разделены через (sub-) папки и каждая из них в отдельный файл .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 извините за столь длинное введение в вопрос и кучу кода.Пожалуйста, не комментируйте мою концепцию кода - друзья здесь хороши, я уверен, что это правильно для моего текущего проекта (это немного трудно увидеть из этого скелета).Я просто хотел бы знать, почему нигде не требуется предварительное объявление.