为什么friend类在静态函数调用时崩溃

Why does friend class crash on static function call?

本文关键字:函数调用 崩溃 静态 friend 为什么      更新时间:2023-10-16
#include <iostream>
using namespace std;
class CClass
{
private:
   friend class CFriend;
   static void privateFunc(){std::cout << "privateFunc" << std::endl;};
};
class CFriend
{
public:
   void privateFunc(){privateFunc();};
};
int main(int argc, char* argv[])
{
   CFriend b;
   b.privateFunc();
   return 0;
}

这段代码可以编译,但是使用gcc编译器或http://www.ideone.com/程序会崩溃。这是编译器错误还是我需要更多地了解朋友类?

你已经创建了无限递归:

void privateFunc(){privateFunc();};
使用

:

void privateFunc(){CClass::privateFunc();};

在对象中无限递归,创建堆栈溢出 !!

你必须显式地调用你的友类:

void privateFunc(){CClass::privateFunc();};

在CFriend类中也有称为privateFunc()的函数。这意味着当你在函数内部调用privateFunc()时,它会调用自己(它怎么知道你指的是另一个类),从而进入一个递归的无限循环。

你的意思

void privateFunc()
{
  CClass::privateFunc();
}

使用CClass::指定您所要的函数的完整名称

由于堆栈溢出而崩溃,您将需要作用域解析来调用静态函数

class CFriend
{
public:
   void privateFunc(){CClass::privateFunc();};
};

无限递归函数的堆栈溢出。CFriend::privateFunc正在调用自己。改成void privateFunc() {CClass::privateFunc();}

作用域的区分,public, private, protected和friend,根本没有运行时结果。它们严格地由编译器来决定哪些是合法的,哪些是不合法的。您可以#define private public,结果可执行文件不会改变。