2011-08-14 1 views
0

"this"키워드와 관련하여 질문이 있습니다. 나는 BiPoly 다항식을 나타내는 "BiPoly"라는 클래스를 가지고 있습니다. BiPoly<NT>::DifferentiateX()이라는 멤버 함수가 있는데, 부분 차등화 X를 얻고 자체 수정됩니다. BiPoly라는 다른 멤버 함수에서C++에서 "this"를 사용하여 멤버 함수에서 로컬 객체를 만들 수 있습니까?

template <class NT> 
BiPoly<NT> & BiPoly<NT>::differentiateX() { 
    if (ydeg >= 0) 
     for (int i=0; i<=ydeg; i++) 
    coeffX[i].differentiate(); 

    return *this; 
}//partial differentiation wrt X 

:: EVAL1는(), 내가 BiPoly<NT>::eval1()를 호출하는 객체의 DifferentiateX()의 결과를 얻을 필요가있다. DifferentiateX()는 자체 수정되었으므로 eval1() 내에서 결과를 얻기 위해 임시 변수를 만들어야합니다. 내 질문은 : "this" 멤버 함수 내에서 임시 개체를 만들 수 있습니까? 그렇다면 어떻게해야합니까?

답변

4
당신은 다음과 차별화를 평가하여 다항식 객체의 복사본 산출 *this에 복사 생성자를 사용할 수 있습니다

:

BiPoly<NT> copy(*this); 
copy.DifferentiateX(); 
NT val = copy.eval1(arg); 

을 당신이 계수를 저장 할 방법에 따라 (을 예를 들어 vector 표준), 당신은 수도 실제로 복사 생성자를 작성할 필요조차 없습니다.

0

함수 내에 만들어진 임시 개체에 대한 참조를 반환하면 안됩니다. 함수 종료시 파괴됩니다.

당신은 오히려이 같은 함수를 선언 할 것 :

template <class NT> 
BiPoly<NT> BiPoly<NT>::differentiateX() { 
    BiPoly nv = *this;  
    if (nv.ydeg >= 0) 
     for (int i=0; i<=nv.ydeg; i++) 
    nv.coeffX[i].differentiate(); 

    return nv; 
}//partial differentiation wrt X 

참고가 객체가 아니라 그것을 참조 (NV의 사본)을 반환합니다.

+0

'differentiateX' 함수에 대한 그의 정의는 완전히 훌륭합니다. 그것은 임시 객체에 대한 참조를 반환하지 않지만,'* this' - 메소드가 호출 된 바로 그 객체입니다. 물론'return BiPoly () .differentiateX(); '와 같은 작업을 수행하는 데 사용할 수 있지만 메소드 자체를 호출하는 것이 아니라 메소드를 호출하는 코드에서 문제가됩니다. – Xion

+0

Xion에 : 예, 그의 질문은 "이 함수를 사용하여"멤버 함수 내에서 임시 객체를 만들 수 있습니까? 그럼 대답은 여전히 ​​유효합니다 :'BiPoly nv = * this;'는이 객체를 사용하여 초기화 할 때 임시 변수를 선언하는 방법입니다. –

관련 문제