2011-07-31 3 views
2

내 코드에 검토되었다 https://codereview.stackexchange.com/questions/3754/c-script-could-i-get-feed-back/3755#3755은 C++을 친구 구문/의미 질문

다음 사용 :

class Point 
{ 
    public: 
    float distance(Point const& rhs) const 
    { 
     float dx = x - rhs.x; 
     float dy = y - rhs.y; 

     return sqrt(dx * dx + dy * dy); 
    } 
    private: 
     float x; 
     float y; 
     friend std::istream& operator>>(std::istream& stream, Point& point) 
     { 
      return stream >> point.x >> point.y; 
     } 
     friend std::ostream& operator<<(std::ostream& stream, Point const& point) 
     { 
      return stream << point.x << " " << point.y << " "; 
     } 
}; 

다른 회원에 의해. 나는 친구의 기능이 무엇을하는지 이해하지 못한다. 친구 기능을하지 않고도이 작업을 수행 할 수있는 또 다른 방법이 있습니까? 그리고 클라이언트는 다음을 사용하여 비공개 일 때 어떻게 액세스 할 수 있습니까? 정확히 무엇이 반환되는지에 대해 누군가 설명 할 수 있습니까?

int main() 
{ 
    std::ifstream  data("Plop"); 

    // Trying to find the closest point to this. 
    Point first; 
    data >> first; 

    // The next point is the closest until we find a better one 
    Point closest; 
    data >> closest; 

    float bestDistance = first.distance(closest); 

    Point next; 
    while(data >> next) 
    { 
     float nextDistance = first.distance(next); 
     if (nextDistance < bestDistance) 
     { 
      bestDistance = nextDistance; 
      closest   = next; 
     } 
    } 

    std::cout << "First(" << first << ") Closest(" << closest << ")\n"; 
} 

답변

1

그리고 그들이 사용하는 개인 경우 어떻게 클라이언트 액세스 그들에게 다음과 같은 수 있습니까?

예. friend 함수는 클래스의 멤버이 아니므로 정의하거나 선언하는 위치는 중요하지 않습니다. 누구든지 그들을 사용할 수 있습니다. 액세스 규칙이 적용되지 않습니다.

정확하게 반환되는 것에 대해 누군가 설명 할 수 있습니까?

operator>>()은 입력 스트림을 나타내는 std::istream&을 반환합니다. operator<<()은 출력 스트림에 대한 참조 인 std::ostream&을 반환합니다.

친구 기능을 사용하지 않고이 작업을 수행 할 수있는 다른 방법이 있습니까?

예. 방법이 있습니다. 당신은 friend 기능이 지금하고있는 일을하는 클래스의 public 섹션에 두 개의 멤버 함수 inputoutput을 추가 할 수 있으며 다음과 같이 operator<<operator>> 아닌 친구 기능을 할 수 있습니다 :

class Point 
{ 
    public: 
    //.... 
    std::istream& input(std::istream& stream) 
    { 
     return stream >> point.x >> point.y; 
    } 
    std::ostream& output(std::ostream& stream) const 
    { 
     return stream << point.x << " " << point.y << " "; 
    } 
    //... 
}; 

std::istream& operator>>(std::istream& stream, Point& point) 
{ 
    return point.input(stream); 
} 
std::ostream& operator<<(std::ostream& stream, Point const& point) 
{ 
    return point.output(stream); 
} 
+1

@ Nawaz 감사합니다. 돌아가서 Stroustrup의 책을 검토해야합니다. 반환되는 구문을 이해하고 있습니까? –

+1

@ Nawaz 다시 한번 말하지만, 반환 된 타입을 이해 합니다만, 그런 타입을 반환함으로써 일어나는 일의 의미/기능성입니다. 나는 stream >> point.x >> point.y가 스트림 생성자의 파일 열기에서 x 및 y 멤버 변수로 읽는다고 가정합니다. 그러나 왜 그것을 돌려 보내야합니까? –

+0

@Matthew :'stream << point1 << point2'라고 쓸 수 있음을 보여줍니다. 즉, * chain * 호출에서 사용할 수 있습니다. – Nawaz

0

친구를 함수는 클래스와 독립적이지만 private 멤버에 액세스 할 수 있습니다.

클래스에서 xy 멤버에 액세스 할 수 없으므로 (클래스가 쓸모 없거나 btw가 됨) 스트림에 대한 인스턴스 읽기/쓰기를 처리 할 수 ​​없으므로 해당 함수를 친구로 선언해야합니다 .

전에 friend 개념을 본 적이 없다면 아마도 코드를 작성하여 C++을 스스로 가르치려는 것입니다. 이것은 끔찍한 생각입니다 ... C++은 여러 가지 이유로 그 방법으로 배울 수 없습니다.

a good book을 선택하고 표지로 덮어 읽고 실험하십시오. 그것은 가장 빠른 (유일한) 방법입니다.

당신이 얼마나 똑똑한 지 상관하지 않습니다. 실제로는 더 똑똑합니다. 실험을 통해 C++을 배우는 것이 더 어려워집니다. 논리가 항상이 장소에서 도움이되는 것은 아닙니다.

+0

"그 전에 친구의 개념을 본 적이 없다면 아마도 코드를 작성하여 C++을 스스로 가르치려고한다는 것을 의미 할 것입니다. 이것은 끔찍한 생각입니다 ... C++은 여러 가지 이유로 그 방법을 배울 수 없습니다." 나는 전에 친구를 보았지만 몇 번이나 그 의미를 잘 알고있는 100 %는 사용하지 않았다. 나는 또한 꽤 많은 C++를 읽었습니다. 나는 그 때 놀고, 약간 더 그 때 놀이를 읽고 읽었다. 그러나 업계의 다른 사람들로부터받은 의견은 많은 도움이됩니다. 나는 C + +로 학교 밖에서 실제 경험이 없으므로 나는 여전히 배우고있다. 그래도 고마워. –

+0

'play '부분은 물론 매우 중요합니다. 읽기/쓰기로 10 배 더 개념을 배울 것입니다. C++의 문제는 꽤 많은 곳에서 언어가 "비논리적"(주로 역사적 이유로)인데 논리 공제가 전혀 도움이되지 않으며 잘못된 길을 안내한다는 것입니다. 이 사실은 프로그래머가 실수를하지 않는 C++의 주요 철학적 개념과 결합됩니다 (따라서 C++의 "런타임 오류 천사"대신 "정의되지 않은 동작 데몬"이 있음)은 왜 실험 전용이 자살인지 분명히해야합니다. – 6502

1

당신은 당신의 선택을 가지고이

class Point 
{ 
public: 
    Point(float xx, float yy) : x(xx), y(yy) {} 

    float getX() const { return x; } 
    float getY() const { return y; } 
private: 
    float x; 
    float y; 
}; 

std::istream& operator>>(std::istream& stream, Point& point) 
{ 
    float x, y; 
    stream >> x >> y; 
    point = Point(x, y); 
    return stream; 
} 
std::ostream& operator<<(std::ostream& stream, const Point& point) 
{ 
    return stream << point.getX() << " " << point.getY() << " "; 
} 

처럼, 당신의 X와 Y의 멤버 변수 및 적절한 생성자에 대한 '게터'를 정의하여 친구 기능없이이 작업을 수행 할 수 있습니다, 모두 유효합니다.

+0

'연산자 >>'는 유효하지 않습니다. 컴파일 해보십시오. – Nawaz

+0

네 말이 맞아. 쓰레기 답변, 어떻게 삭제합니까? – jahhaj

+0

삭제 옵션이 없습니까? 게시물 하단에서 확인하십시오. 'link | edit | delete | flag' 옵션이 있습니다. – Nawaz