gpt4 book ai didi

c++ - friend 类概念如何不需要前向声明(forward declaration)?

转载 作者:可可西里 更新时间:2023-11-01 15:06:59 29 4
gpt4 key购买 nike

我最近刚刚了解了 C++ 中的 friend class 概念(我用 google 搜索了一下,但是这个 answer 让我笑了起来,直到我想起了最重要的部分),并且我正在尝试将它合并到我现在正在进行的项目中。最后挑出了简洁的问题,但总的来说,我对工作代码中完全没有前向声明感到困惑。

我所有的类(class)都通过(子)文件夹分开,每个类(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 &paramFE = 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 很抱歉对这个问题和一堆代码进行了如此冗长的介绍。请不要评论我的代码概念 - friend 们在这里很好,我很确定它对我当前的项目是正确的(从这个框架中很难看出)。我只想知道为什么在任何地方都不需要预先声明。

最佳答案

你是对的,友元声明有点像前向声明。

以下编译:

class A;
class B
{
friend A;
};

class B
{
friend class A;
};

这不是:

class B
{
friend A;
};

前向声明 class A 实际上不是 friend 声明,而是 class 关键字。这就是第二个示例不起作用的原因,因为它不知道 A 是什么。如果您预先声明 A,就像在第一个片段中一样,它可以将 A 解析为类声明。

I stand corrected.

关于c++ - friend 类概念如何不需要前向声明(forward declaration)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9890756/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com