#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/程序崩溃。这是编译错误还是我需要了解更多关于朋友类的内容?
答案 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
并且生成的可执行文件不会更改。