2011-03-09 3 views

답변

7

감사합니다. 클래스 중 하나에서 포인터 또는 참조를 사용해야합니다.

왜 A가 B를 포함하고 A가 B를 포함하고 있는가 ... 재귀의 끝은 없습니다.

모든 개체 변수가 기본적으로 포인터/참조 인 언어 (예 : java)에 익숙하다면 C++에서는 그렇지 않습니다. 당신이 class A { public: B b; };을 쓸 때 완전한 B은 명시 적으로 참조 (B & b;) 또는 (B * b;)

+0

+1 포인터와 * 참조를 언급 한 유일한 사람입니다. –

2

이 포인터를 원하는 나타 내기 위해 필요한 ++ C에서 A. 내 언급 아니라, 가에을 포함입니다 그것을 작동하게하는 방법은 없습니다. 당신은 당신이 B b를 작성 할 때 컴파일러가 무엇 B 알고 있어야하기 때문이다 클래스

class B; 
class A{ 
public: 
B *b; 
}; 

class B{ 
public: 
A a; 
}; 

중 하나에 선언과 포인터를 앞으로 사용해야합니다. 그러나 앞으로 선언을하면 컴파일러는 B이 어떤 클래스인지 알게되고 포인터와 B의 참조를 만들 수 있습니다.

2

두 멤버 개체 중 적어도 하나를 포인터로 변경하는 경우에만. 이 같은 다른 클래스를 전방 선언함으로써 이러한 객체에 멤버 포인터를 선언 할 수있을 것입니다 :

class B; 

class A{ 
public: 
B* pb; 
}; 

class B{ 
public: 
A a; 
}; 

이유 :

컴파일러는 얼마나 객체를 알 필요가있다 각 클래스 (AB)는 메모리에 배치됩니다. 여기에는 각 개체에 대해의 메모리가 얼마나 필요한지 이 포함됩니다. 클래스 멤버는 의 멤버 인에 의존하는 메모리를 필요로하기 때문에 컴파일러는 클래스의 선언을 보았을 때만 클래스 멤버를 선언 할 수 있습니다. 처음으로.

포인터는 항상 같은 양의 메모리를 차지합니다. 이것이 컴파일러에게 "B이 클래스이고 여기 포인터가 B 이길 원한다"고 말할만큼 충분합니다. "B은 클래스입니다."부분은 이라는 순방향 선언라고하는 위의 class B; 행에 해당합니다.

3

생각해보십시오 : 클래스 B의 객체 내부에는 클래스 A의 객체가 있고 그 안에는 클래스 B의 객체가 있습니다. 이것은 물리적으로 불가능합니다! 객체 B의 크기는 어떻게됩니까?

sizeof(B) > sizeof(A) > sizeof(B) 

다른 답변과 마찬가지로 포인터를 사용해야합니다.

+1

+1.나는이 추론을 좋아했다! – Nawaz

관련 문제