2014-04-04 4 views
1

안녕하세요 저는 연산자 오버로딩 및 친구 기능에 대해 배우는 중입니다.여러 파일에 대한 친구 기능

내가 < < 기능 .H 파일 내 클래스의 친구로하지만, 연산자를 선언 한

나는 여전히 캔트 액세스

내 코드가 같이있는 .cpp 파일에 함수 정의에서 개인 멤버 변수 다음 :

Test.h

class Test 
{ 
private: 
    int size; 
public: 
    friend ostream& operator<< (ostream &out, Test& test); 
}; 

에게

#include "Test.h" 
#include <iostream> 

using namespace std; 

ostream& operator<< (ostream& out, Test& test) 
{ 
    out << test.size; //member size is inaccessible! 
} 
012 Test.cpp에를

이미 오퍼레이터를 만들었지 만 분명히 크기에 액세스 할 수 없습니다. < <은 내 클래스의 친구입니다. 나는 조금 봤 거든 아무도 그래서 아무도 나를 도울 수있는 것을 발견하지 못했습니까? 감사.

참고 : 클래스 정의를 .cpp 파일로 이동하면 모든 사람이 작동하므로 내 문제가 여러 파일과 관련되어 있다고 가정합니다.

답변

1

C++에서 선언의 범위는 위에서 아래로 이동합니다. 따라서 첫 번째로 Test.h을 포함하고 그 후에 <iostream> 친구 선언은 유형 std::ostream에 대해 알지 못합니다.

용액 :

Test.h :

#include <iostream> 
class Test 
{ 
private: 
    int size; 
public: 
    friend std::ostream& operator<< (std::ostream &out,const Test& test); 
}; 

Test.cpp에 :

#include "Test.h" 

std::ostream& operator<< (std::ostream& out,const Test& test) 
{ 
    out << test.size; 
    return (*out); 
} 

#include <iostream>Test.hTest.cpp에서 이동되었음을 기록하고 전역의 인자 operator <<constTest& test입니다. const는 연산자가 rvalues에서 작동하게합니다.

+2

헤더의'#include '과 cpp- 파일의'#include '이면 충분합니다. – MadScientist