2009-06-25 9 views
3

나는* 이것을 사용하는 것이 좋습니다.

return *this 

우리는 멤버 함수를 호출하는 클래스의 인스턴스를 반환 할 수있는 유일한 방법 인 경우 확실하지 않다? 제가 질문 한 이유는 강사가 필요하다면 포인터를 사용하지 말라고 말했기 때문이며, 이것이 필요한 유일한 방법은이 포인터를 반환하는 것일 경우 궁금합니다.

저는 개인 데이터 멤버 인 분자와 분모를 보유하는 분수 클래스로 작업하고 있습니다. 제가 이야기 멤버 함수는 예를 들어 두 개의 분수를 추가하는 데 사용됩니다 :

Fraction& plus(const Fraction frac) 

강사가해야 할 우리가 원하는 C = A + =

Fraction C = A.plus(B); 

플러스 멤버 함수가이 같이 정의된다 B, 그래서 나는 그것이 이유라고 생각한다.

+13

새로운 강사를 찾으십시오. –

+1

예에서 A를 수정하는 것이 더하기로되어 있습니까? 그렇지 않다면 A와 B의 합인 새로운 Fraction 객체를 반환해야합니다. –

답변

7

새로운 강사를 찾으십시오. plus()의 선언이 완전히 잘못된 것처럼 보입니다.

는 은 참조를 반환해야하는 경우는 아마 참조
  • 이 아닌 값을 반환해야합니다
    • , 그것은
    • 는 확실히 매개 변수
    로 const를 참조을해야 const를 참조를 반환해야

    이것은 plus() 함수의 현명한 구현을위한 것입니다. 물론 그것은 아마 친구가되어야합니다.

  • +0

    당신의 첫 번째 지점에서 내 마음을 읽고 있습니다 : D – AraK

    +0

    이것은 나쁜 학생이 틀린 교사라는 질문을 잘못 복사했을 가능성이 더 높다고 생각합니다. 나는 포인터에 대한 참조를 선호한다고 주장한다. 그리고 복귀는 선생님이 재검사 한 포인터가 아닌 참조를 반환합니다. –

    +0

    'plus'가'operator + ='와 상응한다고 가정하고 값으로 전달하는 것이 참조로 전달하는 것보다 빠르다고 기대한다면 선언은 괜찮습니다. (나는 그것이 여기의 경우에 놀라지 않을 것이다) –

    1

    예, 이것이 유일한 방법입니다. 메서드에서 현재 개체에 액세스하는 유일한 방법은 this를 통해이며 포인터입니다.

    괜찮습니다. 허용되는 방식입니다.

    1

    *this을 반환해도 아무런 문제가 없습니다. 예를 들어, 수정 연산자의 과부하가 작동해야하는 방식입니다. + 메서드는 실제로 연산자를 오버로드하지 않고 연산자에 + = 연산자를 제공하는 방법 일 뿐이므로이 경우에는 *this을 반환하는 것이 일반적인 동작입니다.

    0

    plus() 메서드에서 새 Fraction 개체를 만들고 반환해야합니다. 현재 개체를 수정 한 다음 *this을 반환하는 것이 좋습니다. 에서 A을 변경하고 싶지는 않을 것입니다. 새로운 Fraction를 반환하려면 plus()의 서명이 가장 좋은 것입니다 :

    Fraction plus(const Fraction &frac); 
    

    (당신이 현재 plus() 방법에 this을 수정하지 않을 경우, 당신은 왜 *this을 반환 할 수 있습니까?)

    2

    I 이 존재하는 보장되도록 this 현재 객체를 참조하기 때문에

    return *this 
    

    를 사용하는 것이 안전합니다,이 경우 생각, 그래서 null이되지 않습니다 . 상기 케이스 C에 첨가 한 결과를 복사하여 생성 될 것이다

    Fraction C = A.plus(B).plus(D) // perhaps? 
    

    참고

    plus 리턴 자체 참조하는 이유는,이 연쇄 될 수 있도록한다. 이것은 또한 작업 plus이 개체 (이 경우 A)를 수정하고이 수정 된 개체에 대한 참조를 반환한다고 가정합니다.

    매개 변수의 복사본을 만드는 대신 참조를 허용하지 않으시겠습니까?

    Fraction& plus(const Fraction& frac) 
    

    이것은 당신이 (예를 들어) operator=을 구현하는 것이 방법과 유사합니다

    A& operator=(const A& right) { 
        if(this == &right) return *this; // Handle self-assignment 
        b = right.b; 
        return *this; 
        } 
    

    은 어쩌면 당신은 개체를 수정하고 새로운 개체를 반환하지 할 것 :

    // assuming there's a constructor Fraction(int numerator, int denominator): 
    Fraction* plus(Fraction const& rhs) 
    { 
        return new Fraction(numerator * rhs.denominator 
             + rhs.numerator * denominator, 
             denominator * rhs.denominator); 
    } 
    

    을하지만이 물론 당신의 작업 (?)에 필요할 수도있는 참조가 아닌 새로운 인스턴스에 대한 포인터를 반환해야합니다.

    또는 더 나은

    : 반환에 복사 구조의 오버 헤드가 없다, 그래서이 함수를 호출의 공간에 분수를 만듭니다

    Fraction plus(Fraction const& rhs) 
    { 
        return Fraction(numerator * rhs.denominator 
            + rhs.numerator * denominator, 
            denominator * rhs.denominator); 
    } 
    

    .

    +0

    사실, null이 아닌 것은 아닙니다. NULL 객체에 대해 메소드를 호출하면 역 참조 될 때 충돌이 발생합니다. – Michael

    +0

    하지만 그 경우에는 +를 호출하려고 할 때 크래시가 발생합니다. 플러스 안쪽에 플러스가 아닌 *를 반환하려고하면 – stefanB

    +0

    라고 가정합니다. 함수가 가상 일 경우 콜에 충돌이 발생합니다. vtable. 그렇지 않으면 유효하지 않은 매개 변수로 비 멤버 함수를 호출하는 것과 같습니다. – Michael

    0

    필자는 그 의미가 멤버 함수 'plus'가 호출자와 호출자의 합계를 나타내는 'new'객체를 반환해야한다고 생각합니다. 당신이 측면이 연산자를 오버로드 할 때 C에서 '새로운'키워드 ++ : 귀하의 예를 들어 너무 을 의미하지 않는다 노트 :: 새로운

    // the constructor accepts (numerator, denominator). 
    // in your case, the caller object would be A, and the called object would be B(other). 
    return Fraction(numerator * other.denominator + other.numerator * denominator, denominator * other.denominator); 
    

    나는 그것이 올바른이에 대한 참조를 돌아 볼 수있는 유일한 장소입니다 효과. 더 명확히하기 위해

    ,이

    Fraction plus(const Fraction& frac); 
    

    호출하거나 호출도

    는 '플러스'에 의해 영향을해야한다, 당신의 '플러스'서명해야합니다.

    0

    우리의 강사가 필요

    경우 실제로는 포인터가 아닌 포인터를 역 참조의 값을 반환하고 포인터를 사용하지 않는 것이 우리에게 말했다. 그래서 너는 잘되어야한다.

    필자는 개인적으로 명시 적으로 메서드를 호출하거나 this을 통해 멤버를 참조하지 않습니다. 즉, 나는 다음을 수행하지 마십시오된다

    class A { 
        public: 
        int x; 
        int get_x() 
        { 
         return this->x; 
        } 
    
        int get_x_plus_5() 
        { 
         return this->get_x() + 5; 
        } 
    } 
    

    는 그러나, 나는 *this를 반환 완벽하게 괜찮아요.

    강사가 아마도 (1) ​​함수에서 스택에있는 객체에 대한 포인터를 반환합니다 (즉, 함수가 종료 된 후에는 존재하지 않는다는 것을 의미합니다). 그리고 (2) 자유 저장소에 객체를 할당하려고합니다. 당신이 할 필요가 없을 때. this은 이러한 문제가 발생하지 않습니다.

    관련 문제