class A{
public:
B b;
};
class B{
public:
A a;
};
아래 정의 된 클래스 B 때문에 클래스 "B b"에 쓸 수 없습니다. 그것을 작동시키는 어떤 방법일까요?아래에 정의 된 클래스 사용 방법은 무엇입니까?
감사합니다.
class A{
public:
B b;
};
class B{
public:
A a;
};
아래 정의 된 클래스 B 때문에 클래스 "B b"에 쓸 수 없습니다. 그것을 작동시키는 어떤 방법일까요?아래에 정의 된 클래스 사용 방법은 무엇입니까?
감사합니다.
감사합니다. 클래스 중 하나에서 포인터 또는 참조를 사용해야합니다.
왜 A가 B를 포함하고 A가 B를 포함하고 있는가 ... 재귀의 끝은 없습니다.
모든 개체 변수가 기본적으로 포인터/참조 인 언어 (예 : java)에 익숙하다면 C++에서는 그렇지 않습니다. 당신이 class A { public: B b; };
을 쓸 때 완전한 B
은 명시 적으로 참조 (B & b;
) 또는 (B * b;
)
이 포인터를 원하는 나타 내기 위해 필요한 ++ C에서 A. 내 언급 아니라, 가에을 포함입니다 그것을 작동하게하는 방법은 없습니다. 당신은 당신이 B b
를 작성 할 때 컴파일러가 무엇 B 알고 있어야하기 때문이다 클래스
class B;
class A{
public:
B *b;
};
class B{
public:
A a;
};
중 하나에 선언과 포인터를 앞으로 사용해야합니다. 그러나 앞으로 선언을하면 컴파일러는 B
이 어떤 클래스인지 알게되고 포인터와 B의 참조를 만들 수 있습니다.
두 멤버 개체 중 적어도 하나를 포인터로 변경하는 경우에만. 이 같은 다른 클래스를 전방 선언함으로써 이러한 객체에 멤버 포인터를 선언 할 수있을 것입니다 :
class B;
class A{
public:
B* pb;
};
class B{
public:
A a;
};
이유 :이
컴파일러는 얼마나 객체를 알 필요가있다 각 클래스 (A
및 B
)는 메모리에 배치됩니다. 여기에는 각 개체에 대해의 메모리가 얼마나 필요한지 이 포함됩니다. 클래스 멤버는 의 멤버 인에 의존하는 메모리를 필요로하기 때문에 컴파일러는 클래스의 선언을 보았을 때만 클래스 멤버를 선언 할 수 있습니다. 처음으로.
포인터는 항상 같은 양의 메모리를 차지합니다. 이것이 컴파일러에게 "B
이 클래스이고 여기 포인터가 B
이길 원한다"고 말할만큼 충분합니다. "B
은 클래스입니다."부분은 이라는 순방향 선언라고하는 위의 class B;
행에 해당합니다.
생각해보십시오 : 클래스 B의 객체 내부에는 클래스 A의 객체가 있고 그 안에는 클래스 B의 객체가 있습니다. 이것은 물리적으로 불가능합니다! 객체 B의 크기는 어떻게됩니까?
sizeof(B) > sizeof(A) > sizeof(B)
다른 답변과 마찬가지로 포인터를 사용해야합니다.
+1.나는이 추론을 좋아했다! – Nawaz
+1 포인터와 * 참조를 언급 한 유일한 사람입니다. –