2011-09-18 4 views
2
#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에서 더 많은 멤버 함수를 가지고있다 (그래서 나는 대안 솔루션이 필요하다).

마지막으로 컴파일러가 수행하는 작업을 설명하는 링크를 누군가 앞으로 줄 때, 선언, 정의에 걸쳐 이 올 수 있습니까? , 당신은 전체 클래스 BA의 친구를 만들 수있는, 당신이하지 않는 방법을

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(); 
}; 

을 또는 :

+0

문제는 C++ 컴파일러가 "one-pass"것입니다. 즉, 현재 이해할 수없는 것을 유지하려고 시도하지 않으며, 나중에 더 많은 정보가있을 때 해결하려고 시도한다는 것을 의미합니다 이 예, 클래스 B에 관한 것). 왜 이것이 오늘날에도 여전히 저와 같은 이유입니다. 어쨌든, 내가 이해하는 한, B를 A의 친구 클래스로 만드는 것은 일할 것이다. 아니면 B가 아닌 다른 회원의 활동에 대한 액세스 권한을 부여해야한다는 의미입니까? – Baltasarq

+0

@Baltasarq : * 뒤에 * 오는 내용에 따라 다른 코드로 컴파일 된 코드 조각을 상상해보십시오. 컴파일 된 언어 중에이 "기능"이 있습니까? – eudoxos

+1

@ eudoxos : 자바, 하나. 구문에는 다중 패스 컴파일러가 필요합니다. 그리고 C++은 다른 클래스에 대해서만 (하지만 클래스 내에서만). –

답변

2

A 전에 B을 정의하고 B의 멤버 데이터로 A에 대한 포인터를 선언 회원 데이터 A의 포인터로 만듭니다.

class B; //forward declaration 

class A 
{  
    int a; 
    friend class B; 
}; 

class B 
{ 
    int b; 
    A x; //No change here 
public: 
    int f(); 

}; 
2

당신이 원하는대로 할 수는 없습니다. 이 친구 함수를 클래스 A에서 선언하려면 클래스 A을 정의하기 전에 클래스 B의 특성을 알아야합니다. 클래스 B에 클래스 A의 인스턴스가 포함되도록하려면 클래스 A의 특성을 클래스 B의 정의보다 먼저 알아야합니다. Catch-22.

B 클래스를 A 클래스의 친구 클래스로 설정하면 전자는 적용되지 않습니다. 후자는 B을 수정하여 A 클래스의 인스턴스에 대한 포인터 또는 참조를 포함하는 경우에는 적용되지 않습니다.

관련 문제