2012-04-09 4 views
2

실제로 파일을 테스트하고 있는데, main.cpp에서 클래스의 보호 된 멤버에 액세스해야하는 상황이 있습니다. 친구로 main()을 추가하려했으나 작동하지 않아 작동하지 않는다는 것을 알게되었으므로 main()에서 test()으로 모든 것을 옮기고 test()을 친구로 삼았습니다. 여전히 오류를 보여줍니다. 자료 : 값이 보호됩니다 :친구 기능이 동일한 파일에 있어야합니까?

//--File.hpp 

namespace Files { 

class File { 
      public: 
       File(long word_):word(word_) {} 
      protected: 
       long word; 
      private: 
       friend int test(); 
}; 
}//ns:Files 


//--List_File.hpp 

namespace Files { 
class List_File :public File { 
     public: 
       List_File() : File(sizeof(int) + sizeof(long)) {} 
     private: 
       friend int test(); 
}; 
}//ns:Files 



//--main.cpp 

    using namespace Files; 

    int test() { 

     File *pd = new List_File(); 
     assert(pd->word == 12); //LINE 34 
     return 0; 
    } 

    int main() { 
     test(); 
     return 0; 
    } 

//이 라인 (34)에 오류가 말한다 될 것이다. 제발 조언.

g++ -O -Wall -Wno-unused -o a.out File.cpp List_File.cpp Data_File.cpp    
    Free_List_File.cpp main.cpp 
    File.hpp: In function ‘int test()’: 
    File.hpp:30:7: error: ‘long int Files::File::word’ is protected 
    main.cpp:34:16: error: within this context 
    make: *** [a.out] Error 1 
+0

(G ++ 4.2에서) 나를 위해 잘 컴파일 게시 된 코드 나 파생 클래스 선언을 수정 한 후, (이 말을한다 "파생 클래스 : 공개 자료를" 하지만 ": 공공 기지"가 누락되었습니다) –

+0

예, 공개 기지가 있습니다. 다시 확인하겠습니다. – howtechstuffworks

+0

@JeremyFriesner 위의 코드 조각이 g ++ 4.4.5로 컴파일 할 때 동일한 오류를 발생시키는 것은 이상한 일입니다. 네임 스페이스와 관련이 있습니까? 네임 스페이스'Files'에'test'를 구현해야 할 수도 있습니다. 사운드 참조를 찾을 수 없으므로 주석 만 있습니다. –

답변

1

아니, 그것은 확실히 같은 파일에있을 필요는 없지만 분명히 클래스, 즉 무엇인지 "알고"해야한다 : 파일에 포함되어야하는 클래스 정의가 헤더 함수가 구현되는 곳. 주석이있는대로 코드가 잘되어야합니다. 당신은 어떤 컨텍스트를 추가 한 후

귀하의 test 기능은 Files 네임 스페이스에 있지 않습니다. 전역 컨텍스트에 있도록하려면 네임 스페이스 내에 "::test"으로 처리해야합니다. 그렇지 않으면 컴파일러에서 "Files::test"이 (가) 귀하의 경우 "::test"이 아닌 friend 함수가 될 것으로 기대할 수 있습니다. 공식적인 표준 참조를 찾을 수 없지만 그럴 것이라고 확신합니다. 여기서 앞쪽 선언을 수행 중이므로 이름 확인을위한 상위 범위의 기본 폴백은 없습니다.

+0

그래, 내가 생각했던 것과 정확히 같아. 확실하지 않은 이유는 무엇입니까?다른 곳으로의 접근을 막기 위해 곧 다시 방문 할 것입니다. – howtechstuffworks

+0

@howtechstuffworks가 실제로 오류를 인용하는 것이 좋습니다 :-) – littleadv

+0

네임 스페이스는 어떤 것에 영향을 줍니까? 왜냐하면, 저는 공용 변수에 접근 할 수 있습니다. 그렇지 않으면 특정 보호 대상 또는 기타 항목에서 액세스 지정자를 언급해야합니까? – howtechstuffworks

1

파생 클래스의 상속 선언이 누락 되었습니까?

class Derived : public Base { 

난 당신의 코드를 테스트 한 (와 상속 선언 포함) 그리고 내가 당신이 파일의 클래스 정의의 범위를 외부의 보호 변수에 액세스하려고하는 추측 할 오류를

+0

아니요, 내 코드가 너무 커서이 코드를 직접 입력 했으니 까 ...... 그러나 왜 여기에 오류가 있는지 모르겠습니다 ... – howtechstuffworks

-1

을 생산하지 않습니다. 변수가 호출 될 때 변수를 반환하고 클래스 정의 외부에서 보호 된 변수에 액세스하는 대신 해당 변수를 사용하는 것이 좋습니다. 내가 틀린 수있는 것은 보호 된 변수의 범위가 무엇인지 (클래스 선언에만 제한적인지 또는 클래스 정의 외부에서 액세스 할 수 있는지 여부) 확실하지 않지만 실제로 맞다고 확신한다. protected 변수는 private 변수와 같습니다. 클래스 범위 내에서만 액세스 할 수 있습니다. 내가 틀렸다면 나를 바로 잡아라.

편집 : 오, 미안하지만 당신이 무엇을했는지 몰랐습니다. littleadv가 맞습니다. 함수 선언이 파일 네임 스페이스 내에 없습니다.

+1

맞아요, 보호되고 전용 변수는 클래스 내부에서만 액세스 할 수 있습니다. 그렇다면 친구 기능의 요점은 무엇입니까? 나는 여전히 오류가 발생하고 그것을 사용하고 있습니다. 어디 보자. 나는 당신이 말한 것과 똑같은 일을했지만 같은 시나리오를 다시 시도하고 디버깅을 할 것입니다. 일단이 과제를 끝내면 U 사람들을 업데이트 할 것입니다. – howtechstuffworks

0

littedev가 맞습니다! 는 .. littedev에 의한 의견에 따라 코드를 업데이트

//--File.hpp 
namespace Files { 
    class File { 
     public: 
      File(long word_):word(word_) {} 
     protected: 
      long word; 
     private: 
      friend int test(); 
    }; 
}//ns:Files  

//--List_File.hpp 

namespace Files { 
    class List_File :public File { 
     public: 
      List_File() : File(sizeof(int) + sizeof(long)) {}   \ 
     private: 
      friend int test(); 
    };  
}//ns:Files  

//--main.cpp  

namespace Files{  
    int test() {   
     File *pd = new List_File(); 
     assert(pd->word == 12); //LINE 34 
     return 0; 
    } 

    int main() { 
     Files::test(); 
     return 0; 
    } 
} 
관련 문제