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

4

5 回答 5

6

您已经创建了无限递归:

void privateFunc(){privateFunc();};

改用:

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

朋友声明没有错。

于 2011-07-12T13:29:17.603 回答
2

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

你的意思是

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

usingCClass::完全指定您所指的函数的名称。

于 2011-07-12T13:30:40.393 回答
2

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

你必须明确地调用你的朋友类:

void privateFunc(){CClass::privateFunc();};
于 2011-07-12T13:30:59.910 回答
2

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

class CFriend
{
public:

   void privateFunc(){CClass::privateFunc();};
};
于 2011-07-12T13:32:59.020 回答
1

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

范围区别,公共的、私有的、受保护的和友元,根本没有运行时后果。它们严格由编译器决定什么是合法的。你可以#define private public并且生成的可执行文件不会改变。

于 2011-07-12T13:32:18.327 回答