为什么朋友类会在静态函数调用时崩溃?

时间:2011-07-12 13:27:51

标签: c++ friend-class

#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/程序崩溃。这是编译错误还是我需要了解更多关于朋友类的内容?

5 个答案:

答案 0 :(得分:6)

你创造了无限递归:

void privateFunc(){privateFunc();};

改为使用:

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

朋友宣言没有错。

答案 1 :(得分:2)

您在CFriend类中也有一个名为privateFunc()的函数。这意味着当你在函数内部调用privateFunc()时,它会调用自身(它应该如何知道你的意思是另一个类),从而进入一个递归的无限循环。

你的意思是

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

使用CClass::完全指定您所指的函数的名称。

答案 2 :(得分:2)

对象中的无限递归,创建 Stack Overflow !!!

你必须明确地打电话给你的朋友班:

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

答案 3 :(得分:2)

由于堆栈溢出而崩溃,您将调整范围解析以调用静态函数

class CFriend
{
public:

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

答案 4 :(得分:1)

你有一个无限递归函数的堆栈溢出。 CFriend :: privateFunc正在调用自己。将其更改为void privateFunc() {CClass::privateFunc();}

范围区别,公共,私人,受保护和朋友,根本没有运行后果。它们严格用于判断合法与否的合规者。您可以#define private public并且生成的可执行文件不会更改。