2010-07-06 74 views
4
#include <iostream> 

class B; 

class A{ 
int a; 
public: 
friend void B::frndA(); 
}; 

class B{ 
int b; 
public: 
void frndA(); 
}; 

void B::frndA(){ 
A obj; 
std::cout << "A.a = " << obj.a << std::endl; 
} 

int main() { 
return 0; 
} 

當我試圖編譯此代碼時發生了一些錯誤。誰能解釋一下這段代碼C++前向聲明,朋友功能問題

+0

發生了什麼錯誤? – Anthony 2010-07-06 05:32:32

+2

我已經重申了這個問題。 「朋友」不是最有用的關鍵字之一。同樣,「前向聲明」在組合在一個標籤中時更有意義。編輯:哦,'class'也更有意義,然後'function'我猜:) – 2010-07-06 05:38:58

回答

3

將整個class B ...聲明class A之前的問題。您尚未宣佈B::frndA();

#include <iostream> 
using namespace std; 

class B{ 
    int b; 
public: 
    void frndA(); 
}; 

class A{ 
    int a; 
public: 
    friend void B::frndA(); 
}; 



void B::frndA(){ 
    A obj; 
    //cout<<"A.a = "<<obj.a<<endl; 
} 

int main() { 
    return 0; 
} 
2

您需要在A之前申報B。編譯器不知道這個:B::frndA()。前向聲明沒有足夠的信息來推斷該類型的成員。

我會建議您將您的類A聲明放在一個文件A.h中,它的定義在文件A.cpp內。同樣,對於相同類型BB.hB.cpp

內部在每一個頭文件的頂部放#pragma once(或者,如果你喜歡包括警衛)。

內。然後你B.h你可以簡單地包括A.h

+1

事實上,編譯一次,可以在同一個文件屬於不同的搜索路徑中失敗,因爲它是基於路徑上,而不是在文件的內容。所有主要編譯器都支持 – 2010-07-06 06:20:14

+0

編譯指示。我不認爲#pragma曾經保證否決票。在這裏看到:http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards/1143958#1143958 – 2010-07-06 06:25:57

+0

事實上,它的作用。 – 2010-07-07 16:44:13

2

問題是你不能朋友的成員函數編譯器已經看到了聲明之前。

您將需要重新排列代碼以解決問題(即在class A之前移動class B的定義)。