2010-07-06 4 views
4
#include <iostream> 

class B; 

class A{ 
int a; 
public: 
friend void B::frndA(); 
}; 

class B{ 
int b; 
public: 
void frndA(); 
}; 

void B::frndA(){ 
A obj; 
std::cout << "A.a = " << obj.a << std::endl; 
} 

int main() { 
return 0; 
} 

이 코드를 컴파일 할 때 오류가 발생했습니다. 누구든지이 코드의 문제점을 설명 할 수 있습니까C++ 전달 함수 선언, friend 함수 문제

+0

어떤 오류가 발생 했나요? – Anthony

+2

질문에 태그를 다시 붙였습니다. '친구'는 가장 유용한 키워드가 아닙니다. 또한 'forward-declaration'은 하나의 태그에 결합 될 때 더욱 의미가 있습니다. 편집 : 오,'클래스'도 더 의미가'함수'내가 추측 : –

답변

3

class A 앞에 class B ... 선언 전체를 배치하십시오. B::frndA();을 (를) 아직 신고하지 않았습니다.

#include <iostream> 
using namespace std; 

class B{ 
    int b; 
public: 
    void frndA(); 
}; 

class A{ 
    int a; 
public: 
    friend void B::frndA(); 
}; 



void B::frndA(){ 
    A obj; 
    //cout<<"A.a = "<<obj.a<<endl; 
} 

int main() { 
    return 0; 
} 
2

당신은 A 전에 B의 선언을 넣어해야합니다. 컴파일러는 이것에 대해 모른다 : B::frndA(). 전방 선언은 유형이 어떤 멤버인지 추론하는 데 필요한 정보가 아닙니다.

클래스 A 선언을 A.h 파일에 넣고 파일 A.cpp에 정의 할 것을 권장합니다. 마찬가지로 각 헤더 파일의 상단에 B.hB.cpp

의 내부 유형 B에 대한 동일 #pragma once를 넣어 (또는 경비원을 포함 선호하는 경우).

B.h 안에는 A.h을 포함 할 수 있습니다.

+1

사실 경로가 아니라 파일의 내용을 기반으로하기 때문에 같은 파일이 다른 검색 경로 내에있는 경우 실제로 한 번 실패 할 수 있습니다 . –

+0

pragma는 모든 주요 컴파일러에서 한 번 지원됩니다. 나는 #pragma가 투표를 한 번 보증하지 않는다고 생각한다. 여기를 참고하십시오 : http://stackoverflow.com/questions/1143936/pragma-once-vs-include-guards/1143958#1143958 –

+0

실제로 그렇게합니다. –

2

컴파일러가 선언을보기 전에 멤버 함수를 친구로 사용할 수 없다는 것이 문제입니다.

문제를 해결하려면 코드를 다시 정렬해야합니다 (예 : class B의 정의를 class A 이전로 이동).