2011-07-12 57 views
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/該程序崩潰。這是一個編譯器錯誤,還是我需要更多地瞭解朋友類?爲什麼friend類會在靜態函數調用中崩潰?

+10

StackOverflow上的崩潰? – aardvarkk

回答

6

您已經創建了無限遞歸:

void privateFunc(){privateFunc();}; 

使用,而不是:

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

有什麼不妥的朋友聲明。

2

在CFriend類中也有函數privateFunc()。這意味着當你在函數裏面調用privateFunc()時,它會調用它自己(它應該知道你指的是其他類),從而進入一個遞歸的無限循環。

您使用CClass::指定完全你的意思是函數的名稱意味着

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

2

無限遞歸在您的對象中,創建一個堆棧溢出 !!!

你必須明確地打電話給你的朋友等級:

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

我喜歡** Stack Overflow !!! *** ;-) – NirMH

1

你有一個堆棧溢出從無限遞歸函數。 CFriend :: privateFunc正在自稱。將其更改爲void privateFunc() {CClass::privateFunc();}

範圍區分,公共,私人,受保護和朋友,根本沒有運行時影響。他們嚴格要求調解人決定合法與否。你可以#define private public和生成的可執行文件不會改變。

2

這是因爲堆棧溢出,你會木珠範圍解析調用靜態函數

class CFriend 
{ 
public: 

    void privateFunc(){CClass::privateFunc();}; 
}; 
相關問題