2016-10-12 27 views
4

我想了解嵌套類中的友誼的概念,但我沒有正確理解概念。我已經寫了一個示例程序,瞭解它,但程序不工作嵌套類中的友誼C++

#include<iostream> 

using namespace std; 


class outerClass 
{ 
    private: 
     int a; 
    public: 
     class innerClass; 
     bool print(innerClass); 
}; 

class innerClass 
{ 
    friend class outerClass; 
    private: 
     int b; 

    public: 
     innerClass() =default; 

}; 

bool outerClass::print(outerClass::innerClass obj) 
{ 
    cout<<"Value of b in inner class is:"<<obj.b; 
} 

int main() 
{ 
    outerClass in; 
    outerClass::innerClass obj; 
    obj.b=5; 
    in.print(obj); 
} 

我得到以下錯誤:

try.cpp: In member function ‘bool outerClass::print(outerClass::innerClass)’: 
try.cpp:26:6: error: ‘obj’ has incomplete type 
try.cpp:11:15: error: forward declaration of ‘class outerClass::innerClass’ 
try.cpp: In function ‘int main()’: 
try.cpp:34:28: error: aggregate ‘outerClass::innerClass obj’ has incomplete type and cannot be defined 

當我通過互聯網上的文章閱讀我學到了以下幾點,請他們發表評論如果它們正確與否:

  • innerClass默認情況下可以訪問outerClass的所有成員。
  • 對於outerClass訪問innnerClass的私有成員,我們需要將outerClass作爲friend類到innerClass。

請幫忙指出代碼中的錯誤,以及如果我理解的觀點是正確的。

+0

這裏的[關於內部類的定義,一個提示](http://stackoverflow.com/questions/8693590/how-to-make -an-inner-class-without-put-the-class-class-class-to-pare)外部類定義 – grek40

回答

2

如果你想定義的outerClassinnerClass外,這裏是如何做到這一點:

class outerClass 
{ 
    class innerClass; // forward declaration 
}; 

class outerClass::innerClass // definition 
{ 
}; 

剩下的就是好的,除了的obj.b=5。允許類outerClass訪問innerClass::b,函數main()不是。

Demo


內部類默認可以訪問的在OuterClass所有成員。

沒錯。從標準[class.access.nest]

嵌套類是一個部件,因此具有相同的訪問權限的任何其它構件。


對於在OuterClass訪問innnerClass的私有成員,我們需要做的在OuterClass朋友類內部類。

沒錯。從標準[class.access.nest]:一個封閉類的

成員具有爲嵌套類的成員沒有特殊的訪問;

+0

我糾正了這個錯誤,但仍然無法在打印功能中訪問innerClass的私有成員。你能幫忙嗎? –

+0

@MayankJain請參閱演示。 – sergej

+0

你的意思是? 「你不能在主要做...」(你寫的可以) –

4

outerClass內的行class innerClass;正向聲明到您從未定義的class。因此outerClass::innerClass不完整類型

單獨innerClass定義與

class innerClass 
{ 

開始是完全不同class向前聲明的類。

在定義的innerClass中,您的friend class outerClass;聲明沒有任何問題。

+0

對不起,這是一個微不足道的錯誤。我糾正它,但即使現在我不能在打印功能訪問innerClass的私有成員'b'。 –

0

我覺得你與nested classfriend class
混淆您可以使用friend class不使用nested class
可以使用nested class不使用friend class

下面是一些例子:

class A {}; 
class B {}; 

這裏A類知道B類,但B不知道A類。所以你需要告訴A類B類是存在的。
該做的事情,被稱爲向前聲明
所以:

class B;  // forward declaration 
class A {}; // A knows the B 
class B {}; // B knows the A