2012-11-22 3 views
1

경고는 ostream & operator<<(ostream &os, A &A0) 함수에 의해 생성됩니다.친구 클래스의 return 문이 없습니다.

다음은 클래스의 정의 방법은 다음과 같습니다

class A 
{ 
    public: 
     friend ostream & operator<<(ostream &os, A &A0); 
     A& operator=(string strSlot_); 
     A& operator+(string strSlot_); 
     A& operator+(const A &B); 
     A& operator=(const A &B); 
     string slotReturn(); 
     A(string strSlot_); 
     A(const A &object); 
     void slotChange(); 
     void sCout(); 
     ~A(); 
     A(); 
    private: 
     string strSlot; 
     int n; 
}; 


ostream & operator<<(ostream &os, A &A0) 
{ 
    os << "strSlot = \"" << A0.slotReturn() << "\"" << endl; 
} 

string A::slotReturn() 
{ 
    return strSlot; 
} 

문제는, 그것은 반환하도록되어 무엇? *this이 작동하지 않는 것 같습니다 (friend입니까?). (단지 경고 일 뿐이지 만 여전히 알고 싶습니다.)

A &A0을 const로 전달할 수없는 이유는 무엇입니까? (이 경우 오류는 "const A '를'this '로 전달합니다. 'std :: string A :: slotReturn()'의 인수가 한정어를 버립니다.)?

+1

'slotReturn()'을 만들어야하기 때문에 ac onst 방법, 내 대답에 제안했다. – juanchopanza

답변

5

당신은 std::ostream& 자체를 반환해야 AS를

ostream & operator<<(ostream &os, A &A0) 
{ 
    return os << "strSlot = \"" << A0.slotReturn() << "\"" << endl; 
} 

제쳐두고, 용어가 약간 꺼져 있습니다. "친구 클래스"는 없습니다. std::ostream& operator<<은 여기에있는 친구입니다. 하지만 친구가 될 필요조차 없습니다. 단지 A의 public member 함수를 호출하기 때문입니다. 친구 선언을 삭제할 수 있습니다.

당신은 아마 또한 slotReturn()에게 const 방법을 확인해야합니다 :

string slotReturn() const; 
     //   ^const method 

을하고 const를 참조 취할 ostream& operator<<을 수정

: 이것은 당신이 임시직을 인쇄 할 수

ostream & operator<<(ostream& os, const A& A0) { .... } 

std::cout << A("I am a temporary!") << "\n"; 
+0

+1에 대한 추가 설명 및 '친구가 될 필요는 없습니다.' –

+0

@ErgoProxy 예, 가능합니다. 친구는 "이 기능/운영자가 개인 또는 보호 된 필드에 액세스하도록 허용"을 의미하며 운영자는하지 않습니다. 따라서 오류는 서로 관련이 없어야합니다. – juanchopanza

+0

@ juanchopanza, 아 감사합니다. 코드를 정리해 보겠습니다. 우리는 대학에서 C++을 시작했습니다. 그래서 제 용어 사용이 중단 된 것입니다. 저에게 명확히 해 주셔서 감사합니다. :) –

관련 문제