【发布时间】:2012-03-27 13:43:59
【问题描述】:
我最近刚刚了解了 C++ 中的 friend class 概念(我用谷歌搜索了一下,但这个 answer 让我发笑,直到我想起最重要的部分),我正在尝试将把它放到我现在正在做的项目中。简洁的问题最后被挑出来,但总的来说,我对我的工作代码中完全缺乏前向声明感到困惑。
我所有的类都通过(子)文件夹分开,每个类都放在一个单独的 .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!
}
现在,我已经让所有这些都与所有依赖项一起实际编译(必须在最后将其写到类图中才能使其工作),但现在可以了。实际上让我困惑的事实是不需要前向声明。我知道之前的前向声明,为了以防万一,我用this answer 刷新了我的记忆。
所以,为了清楚起见,我的问题:
将class TLS 声明为朋友时,为什么不需要明确的前向声明?这是否意味着 friend class 声明本身就是一个前向声明?对我来说,直觉上,这里缺少一些东西......而且由于它可以正常编译和工作,有人可以帮助纠正我的直觉吗? :D
PS 很抱歉对这个问题和一堆代码进行了如此冗长的介绍。请不要评论我的代码概念 - 朋友们在这里很好,我很确定这对我当前的项目是正确的(从这个骨架中很难看出)。我只是想知道为什么在任何地方都不需要前向声明。
【问题讨论】:
标签: c++ class forward-declaration friend-class