2011-05-28 53 views
7

有沒有解決這個辦法:遞歸友元類

class B; 

class C { 
public: 
    C() { } 
private: 
    int i; 
    friend B::B(); 
}; 

class B { 
public: 
    B() { } 
private: 
    int i; 
    friend C::C(); 
}; 

給出錯誤:

prog.cpp:8: error: invalid use of incomplete type ‘struct B’ 
prog.cpp:1: error: forward declaration of ‘struct B’ 
+0

我認爲最接近你可以得到的是'friend class B' – 2011-05-28 00:20:03

+1

你到底想要做什麼,你需要B和C的構造函數互相可見嗎? – 2011-05-28 00:26:12

+0

@Mike,這實際上是一個合成的例子。真實情況是,由於理由複雜,我不能允許依賴C來強制依賴於B. – BCS 2011-05-28 01:55:52

回答

5

你不能做到這一點。刪除循環依賴。

+0

的定義哦。 。 。 。 FUD。 – BCS 2011-05-28 00:21:46

+0

你可以遞歸地給全班授予友誼,而不是給個別成員。 – Nemo 2011-05-28 00:23:16

+0

@Nemo:確實。 – 2011-05-28 01:01:56

3

根據IBM's documentation(我知道的是不規範):

A class Y must be defined before any member of Y can be declared a friend of another class.

所以我認爲答案是 「不」。

當然,你可以使用

friend class B; 

...而不是friend B::B(),但授予友誼所有B的成員。你可能已經知道了。

2

由於您對友誼非常有選擇性(訪問特定類別的特定成員函數),因此您可能需要Attorney-Client Idiom。不過,我不確定這將如何與構造函數一起工作。

1

我意識到這是一個非常愚蠢的想法,但是理論上你不能通過繼承來實現這一點,通過使父類的構造函數成爲朋友?該代碼編譯,至少,儘管它可能是可疑的。

class A { 
public: 
    A() { } 
private: 
    int i; 
}; 

class D { 
public: 
    D() { } 
private: 
    int i; 
}; 

class B : public A { 
public: 
    B() { } 
private: 
    friend D::D(); 
}; 

class C : public D { 
public: 
    C() { } 
private: 
    friend A::A(); 
}; 
+3

我認爲友誼不能被繼承... C不是B和B的朋友它不是C的朋友在這裏... – vrince 2011-05-28 00:43:47

+0

友誼絕對不會被遺傳。 – Nemo 2011-05-28 01:05:37

+0

是的。但是如果你只是想讓構造函數訪問私有變量,這將使B和C的父類的構造函數可以訪問B和C中的私有數據 - 可以分別由B和C的構造函數調用它們 - 即使B和C C不能直接訪問彼此的私人數據。 – 2011-05-28 01:07:45