2010-12-16 69 views
2

如何創建兩個具有成員指向彼此類類型的類,並且完全訪問彼此的數據?換句話說,我需要兩個類是這樣的:朋友類互相指點

class A 
{ 
protected: 
    B *p; 
}; 

class B 
{ 
protected: 
    A *p; 
}; 

我與它有麻煩,因爲我沒有達到標準與C++約定,顯然,A類不能聲明一個類B,因爲B在代碼後面聲明。

感謝您的幫助

+2

C++是一個地方的朋友訪問你的私人會員。必須在此提及:P – jrharshath 2010-12-16 12:40:11

+2

當然問題是:如果您有兩個如此緊密耦合的類,那麼您確定您的設計是正確的嗎?當然,聽起來你的班級邊界在某個地方是錯誤的。 – GrahamS 2010-12-16 13:33:57

回答

3

您應該使用轉發類聲明。

//in A.h 

    class B; // forward declaration 
    class A 
    { 
    protected: 
     B *p; 
     friend class B; // forward declaration 
    }; 

//in B.h 
class A; // forward declaration 
class B 
{ 
protected: 
    A *p; 
    friend class A; // forward declaration 
}; 
1

必須使用前置聲明,如:

class B; 
class A{ 
    ... 
    friend class B; 
}; 
+0

謝謝......友誼呢? – oldSkool 2010-12-16 12:23:15

+0

朋友B班; – kinnou02 2010-12-16 12:25:35

1
class A 
{ 
protected: 
    class B *p; 
}; 

如果你想聲明的友誼,你需要預先聲明:

class B; 

class A 
{ 
friend class B; 
protected: 
    B *p; 
}; 
+0

不值得downvote國際海事組織,但你實際上不需要*在第二個例子中單獨的前向聲明。你可以做'朋友類B'和'B類* p',並省略第一個'B類'。 – 2010-12-16 12:36:24

+0

@Steve是的,你是對的。不知道我在那裏想什麼。 – 2010-12-16 12:40:42

1
class B; 
class A 
{ 
protected: 
    B *p; 
    friend class B; 
}; 

class B 
{ 
protected: 
    A *p; 
    friend class A; 
}; 
+0

真棒,謝謝:) – oldSkool 2010-12-16 12:23:36

+0

此代碼是否允許類A使用在B類中聲明的內聯函數? – oldSkool 2010-12-16 12:25:31

+0

@舊式規則:'inline'與函數是否可訪問完全無關。 – 2010-12-16 12:26:35

1

你可以使用正向聲明n做class B; A級以上

1

簡單使用: 類B;

class A 
{ 
    protected: 
     B *p; 
     friend class B; 
}; 

class B 
{ 
    protected: 
     A *p; 
     friend class A; 
}; 

使用B類;意味着前向聲明,這基本上告訴編譯器:「類B存在於某處」。

2
class B; 
class A { 
    friend class B; 
    protected: 
    B *p; 
}; 

class B { 
    friend class A; 
    protected: 
    A *p; 
}; 

注意,這實際上使用B的成員的任何成員函數將具有B的定義之後被定義,例如:

class B; 
class A { 
    friend class B; 
    protected: 
    B *p; 
    A *getBA(); 
}; 

class B { 
    friend class A; 
    protected: 
    A *p; 
}; 

A *A::getBA() { return p->p; }