为什么friend类在静态函数调用时崩溃
Why does friend class crash on static function call?
#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
,结果可执行文件不会改变。
相关文章:
- 使用 MS 绕道挂钩在调用钩子函数时崩溃C++
- 钩/绕道 d3d9 (现在/结束场景) - 似乎调用我的函数然后崩溃
- EGL 在第一次 opengl 函数调用时崩溃
- 从C调用C 函数时崩溃
- VS2015 应用程序在调用具有委托C++函数时崩溃
- 在对象上调用luabind函数时崩溃
- 从c#调用c++dll函数时崩溃
- 从实例化为静态本地崩溃的类的构造函数调用QPluginLoader::staticInstance
- 我的程序在 c++ 中调用函数时崩溃
- 析构函数调用delete函数时程序崩溃
- QWidget winId在从构造函数调用时崩溃
- C++在函数调用和函数完成后,游戏彻底崩溃
- 更新函数调用中的静态成员会导致崩溃
- c++析构函数调用数组索引?在非线程安全的refcount对象上崩溃
- VS2012,使用系统函数调用exe,这会导致崩溃
- 在析构函数调用期间,glDeleteBuffers崩溃
- c++全局/堆栈实例ctor/dtor调用静态函数时崩溃
- Windows内CreateThread类函数调用,指针引用崩溃
- 为什么friend类在静态函数调用时崩溃
- 如何避免在从.so调用抛出异常的函数时崩溃