2011-06-15 25 views
0

一個朋友,我想打一個內部類無關類的朋友,但似乎並沒有工作(至少在GCC 4.1.2):讓一個內部類在C++

class A { 
    int i; 
    friend class B; // fine 
    friend class B::C; // not allowed? 
}; 

class B { 
    int geti(A* ap) { return ap->i; } 

    class C { 
     int geti(A* ap) { return ap->i; } 
    }; 
}; 
+1

很多基本的錯誤的你的代碼,請首先解決這些問題:沒有「B :: C :: geta()」,「A :: i」是私人的。 「B :: C :: geti()」是私有的。 – 2011-06-15 13:48:09

+0

只需忽略主要功能。 – dave 2011-06-15 13:50:12

+5

「只是忽略主要功能。」難以置信。當你告訴鏈接器時它有用嗎? – 2011-06-15 13:53:30

回答

3

你在使用之前必須聲明B::C。以下可能工作。

更新:忽略的請求一個可用的演示,這裏是記住這個結構(減去的成員函數的定義),可以工作,但熊的一種方式,一切都是私人,因爲它主張。

class A; 

class B 
{ 
    int geti(A * ap); 

public: 
    class C 
    { 
    int geti(A * ap); 
    }; 
}; 

class A 
{ 
    friend class B; // fine 
    friend class B::C; // fine too 
    int i; 
}; 

然後別處定義getter函數:

int B::geti(A * ap) { ... } 
int B::C::geti(A * ap) { ... } 

備選:正向聲明嵌套類B::C和保存一個外部定義:在

class A; 

class B 
{ 
    int geti(const A * ap) const; // we cannot use A yet! 

public: 
    class C; 
}; 

class A 
{ 
    friend class B; // fine 
    friend class B::C; // fine too 
    int i; 
}; 

int B::geti(const A * ap) const { return ap->i; } 

class B::C 
{ 
    inline int geti(const A * ap) const { return ap->i; } 
}; 
+0

好的,謝謝,但是沒有辦法以同樣的方式通過'class B :: C;'來聲明'B :: C'我們可以做'B類';'宣佈'B'?不得不把吸氣劑放在別處很煩人。 – dave 2011-06-15 13:56:47

+0

我發佈了一個替代方案,但我不知道這是否更好。 – 2011-06-15 14:01:07

+5

@dave - 不,你不能聲明這樣的嵌套名稱。在'類B :: C'中B是類還是名稱空間? – 2011-06-15 14:10:04