我最近刚刚了解friend class
了 C++ 中的概念(我用谷歌搜索了一下,但这个答案让我发笑,直到我记住了最重要的部分),我正试图将它融入我的项目中现在正在工作。简洁的问题最后被挑出来,但总的来说,我对我的工作代码中完全缺乏前向声明感到困惑。
我的所有类都通过(子)文件夹分开,每个类都放在单独的.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很抱歉对这个问题和一堆代码进行了如此冗长的介绍。请不要评论我的代码概念 - 朋友们在这里很好,我很确定这对我当前的项目是正确的(从这个骨架中很难看出)。我只想知道为什么在任何地方都不需要前向声明。