2016-10-12 2 views
4

중첩 클래스에서 우정의 개념을 이해하려고하지만 개념을 제대로 이해하지 못하고 있습니다. 나는 그것을 이해하는 샘플 프로그램을 작성했지만이 프로그램은 내가 오류 아래 얻고있다중첩 클래스의 우정

#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의 private 멤버에 액세스하려면 innerClass에 friendClass 클래스로 outerClass를 만들어야합니다.

코드의 실수를 지적하고 이해 한 점이 맞다면 도와주세요. outerClass

+0

다음 [내부 클래스의 정의에 힌트] (의 http://stackoverflow.com/questions/8693590/how-to-make :
이하고있는 일은, 앞으로 선언 그래서
라고 외부 클래스 정의 외부에서 내부 클래스를 정의하지 않고 내부 클래스를 정의하지 않음) – grek40

답변

2

당신은 여기 그것을하는 방법이다 outerClassinnerClass 외부를 정의하려면 :

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

class outerClass::innerClass // definition 
{ 
}; 

나머지는 obj.b=5의 제외, OK입니다. outerClass 클래스는 innerClass::b에 액세스 할 수 있으며, main() 함수는 액세스 할 수 없습니다.


Demo

innerClass는 기본적으로 outerClass의 모든 구성원에 액세스 할 수 있습니다.

오른쪽. [class.access.nest] 표준 에서 :

중첩 클래스는 부재이고 같은 다른 부재와 같은 액세스 권한을 갖는다.outerClass를 들어


우리가 innerClass에 친구 클래스로 outerClass해야 innnerClass의 private 멤버에 액세스 할 수 있습니다.

오른쪽. 표준 [class.access.nest]에서 : 바깥 쪽 클래스의

회원 중첩 클래스의 멤버에 특별한 액세스 할 수 없습니다;

class A {}; 
class B {}; 

:

+0

실수를 바로 잡았으나 인쇄 기능으로 내부 클래스의 private 멤버에 액세스 할 수 없습니다. 좀 도와 줄 수있어? –

+0

@MayankJain 데모를 참조하십시오. – sergej

+0

의미 하시겠습니까? "당신은 메인에서 할 수 없다".. (당신이 썼다) –

4

라인 class innerClass; 사용자가 정의한 적이없는 class앞으로 선언입니다.

따라서 은 불완전한 유형입니다.

class innerClass 
{ 

시작

별도의 innerClass 정의는 앞으로 선언 된 클래스에 완전히 다른 class이다.

정의 된 innerClass 내에서 friend class outerClass; 문에 아무런 문제가 없습니다.

+0

미안하지만 사소한 실수였습니다. 나는 그것을 고치지 만 지금은 print 함수에서 내부 클래스의 private 멤버 인 b에 접근 할 수 없다. –

0

나는 몇 가지 예입니다 당신은 여기

friend class를 사용하지 nested class을 사용할 수 있습니다 nested class
를 사용하지 friend class을 사용할 수 있습니다 당신은 nested classfriend class
와 혼동 생각 여기서 A 클래스는 B 클래스를 알고 있지만 B 클래스는 A 클래스를 알 수 없습니다. 따라서 A 클래스에 B 클래스가 있음을 알릴 필요가 있습니다.

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