#include <stdio.h>
class B;
class A;
class A
{
int a;
friend int B::f();
};
class B
{
int b;
class A x;
public:
int f();
};
int B::f()
{
// ...
}
main()
{
class B b;
b.f();
}
ERRORS를 함수 :불완전한 타입 에러가 친구를 사용할 때하면
a.cpp:9: error: invalid use of incomplete type ‘struct B’
a.cpp:2: error: forward declaration of ‘struct B’
문제는 B가 유형 A.
의 목적을 위해이있다 같이 전에 B의 정의를 배치함으로써 해결 될 수 없다 이 예제는 B 친구 클래스를 만드는 것이지만, 내 실제 코드에서 나는 B에서 더 많은 멤버 함수를 가지고있다 (그래서 나는 대안 솔루션이 필요하다).
마지막으로 컴파일러가 수행하는 작업을 설명하는 링크를 누군가 앞으로 줄 때, 선언, 정의에 걸쳐 이 올 수 있습니까? , 당신은 전체 클래스 B
A
의 친구를 만들 수있는, 당신이하지 않는 방법을
class A; //forward declaration
class B
{
int b;
A *px; //one change here - make it pointer to A
public:
int f();
};
class A
{
int a;
friend int B::f();
};
을 또는 :
문제는 C++ 컴파일러가 "one-pass"것입니다. 즉, 현재 이해할 수없는 것을 유지하려고 시도하지 않으며, 나중에 더 많은 정보가있을 때 해결하려고 시도한다는 것을 의미합니다 이 예, 클래스 B에 관한 것). 왜 이것이 오늘날에도 여전히 저와 같은 이유입니다. 어쨌든, 내가 이해하는 한, B를 A의 친구 클래스로 만드는 것은 일할 것이다. 아니면 B가 아닌 다른 회원의 활동에 대한 액세스 권한을 부여해야한다는 의미입니까? – Baltasarq
@Baltasarq : * 뒤에 * 오는 내용에 따라 다른 코드로 컴파일 된 코드 조각을 상상해보십시오. 컴파일 된 언어 중에이 "기능"이 있습니까? – eudoxos
@ eudoxos : 자바, 하나. 구문에는 다중 패스 컴파일러가 필요합니다. 그리고 C++은 다른 클래스에 대해서만 (하지만 클래스 내에서만). –