2014-06-06 89 views
0

我試圖訪問一個朋友的方法定義如下。我有4個文件。兩個頭:如何正確訪問好友功能?

a.h頭:

#include "b.h" 

class A 
{ 
public: 
    A(); 
    ~A(); 
    void testStuff(int i); 
}; 

部首b.h

#include "a.h" 

class A; 

class B 
{ 
    friend class A; 

public: 
    B(); 
    ~B(); 
    friend void doStuff(int i); 
}; 

和兩個包括一些代碼,a.cpp

#include "a.h" 

void A::testStuff() 
{ 
    B b {B()}; 
    b->doStuff(1); 
} 

b.cpp

#include "b.h" 

void B::doStuff(int i) 
{ 
    m_stuff = i; 
} 

如果我刪除關鍵字friend一切工作正常。但是,如果我宣佈doStuff()作爲一個朋友,我得到以下錯誤:

error: ‘class B’ has no member named ‘doStuff’ 

我嘗試以下this教程。我錯過了什麼?

+2

'doStuff()'是'B'的「朋友」方法,而不是成員。 – Rakib

+0

更改'朋友無效doStuff(INT我);''無效doStuff(INT我);' – drescherjm

+0

@RakibulHasan到底,我錯過了什麼? – default

回答

4

您對friend函數的理解是錯誤。如果您向另一個類聲明函數friend,則表示friend函數可以訪問該類的成員,但這並不意味着friend函數將變爲類成員

這裏doStaff()friendB,而不是一個的B構件。但是你在B的對象上使用它,因此編譯器說它不是該類的成員。使用friend給予doStaff權限訪問Bprivate成員。

您正在關注的教程很清楚地說明了這一點。 duplicate()方法是Rectangle的朋友,因此它可以訪問private成員widthheight,但duplicate()未用作Rectangle的類方法。

總之,你的問題是錯誤的。您可以像訪問免費(非類方法)函數一樣訪問friend函數。問題是函數如何訪問它所屬的類的成員,並且如所說的那樣,它可以訪問該類中的所有內容,這是具有朋友功能的動機,即允許訪問個人的私人成員上課。

同樣,一個friend類可以訪問它是朋友的類的所有內容。

因此,對於您的問題,要麼從doStaff刪除friend,使其成爲B的成員。但我猜你的目的是使用friend方法,在這種情況下,你可以做到以下幾點:

void doStuff(B b, int i) 
{ 
    b.m_stuff = i; // it is friend function of B, so can access m_staff 
} 

,或者你可以讓成員AdoStaff(),然後你可以寫

class A{ 
    //other members 
    void doStaff(B& b, int i){ b.m_staff=i;} 

void A::testStuff() { 

    B b {B()}; 
    doStuff(b,1); //although u can just write "b.m_staff = 1;" right here 
} 
+0

現在我明白了。我認爲我可以使用朋友的私人方法,但訪問它的成員更加舒適。謝謝。 – default

3

會有沒有必要在你自己的班級中將方法聲明爲「朋友」。因此,像

friend void doStuff(int i); 

朋友聲明B類裏面實際上並沒有聲明B類的成員函數(它的家人,你不需要讓它的朋友),它聲明瞭一個名爲doS​​tuff全局函數。你可以寫

friend void A::doStuff(int i); 

,意思是「如果有一個命名爲A類的地方,它有一個名爲doS​​tuff有一個int參數成員,則該成員函數是朋友」。你寫的是「如果某個地方有一個全局函數doStuff(int i),那麼這個函數是一個朋友」。

所以你還沒有在你的類中聲明B:doStuff(int i),並且非常明智地實現該函數會給出一個錯誤。

如果你想要A :: testStuff()被允許調用doStuff,你應該添加在B類:

friend void A::testStuff(); 
+0

+1絕對,在這個例子中這是一個全局的朋友函數。 – Wolf

1

你宣佈doStuff()作爲成員B類的,當你做了「void B :: doStuff(int i)」,但是 的的朋友關鍵字適用於非會員的功能。它基本上是爲了讓一個不是類的成員的函數可以訪問該類的私有成員。

順便說一句,B有A類聲明爲朋友,這意味着你在一個聲明可以在B類

訪問私有成員函數正如你所看到的,有聲明友元類之間的差異和朋友功能。