2010-08-09 4 views
1

인사, 모두들!연결 방법 및 임시 변수를 명확히하십시오

나는 "원"(예를 들어)에 대한 포인터를받는 클래스를 가지고 있으며, "연결"방법을 통해 속성을 조정합니다. 이런 식으로 뭔가 :

class CCircleSetter 
{ 
public: 
    explicit CCircleSetter(CCirclePtr circle) : m_circle(circle) 
    { 
    } 

    CCircleSetter & Radius(int radius) 
    { 
     if (m_circle) m_circle->SetAttribute("radius", radius); 
     return *this; 
    } 
    CCircleSetter & Center(CPoint center) 
    { 
     if (m_circle) m_circle->SetAttribute("center", center); 
     return *this; 
    } 

    operator bool() const 
    { 
     return (m_circle != NULL); 
    } 

private: 
    CCirclePtr m_circle; 
}; 

지금이 코드가 합법적인지 여부를 궁금해 :

한편으로
if (CCircleSetter(myCircle).Radius(10).Center(myPoint)) 
{ ... } 

, 내가 표현 "만일"내부에서 생성 된 임시 객체가, 때까지 살 것이라고 생각 이 표현의 끝. 따라서 "반경"과 "중심"에 대한 호출은 합법적입니다. 그러나 다른 한편으로는 임시 변수에 대한 참조를 사용하는 것은 정의되지 않은 동작이며 "this"가 임시 인 경우 (* this)를 사용하여이 종류의 작업을 수행하고있는 것처럼 보입니다. 그것은 나에게 몇 가지 의심을 안겨주므로, 제발, 분명히하십시오. 감사!

+0

"체인 연결 방법을" 이것은 [유창한 인터페이스] (http://en.wikipedia.org/wiki/Fluent_interface)에서의 시도 인 것 같습니다. –

+0

링크를 제공해 주셔서 감사합니다. 위키에서 : "유창한 인터페이스는 단순한 메소드 연쇄를 필요로합니다."=) – SadSido

답변

2

아니요, 아주 특별한 경우에는 괜찮습니다. 전체 행이 실행 된 후에 임시 파일이 삭제되기 때문에 일반적으로 임시 파일을 참조하는 것이 좋지 않습니다. 당신이 무슨 일을하는지

+0

"전체 라인이 실행 된 후에 임시가 삭제됩니다."- 정확히 내가 듣고 싶었던 것입니다. 표준에 대한 언급이 있습니까? – SadSido

+0

C++ 11에 대한 참조는 * 12.2 * 단락 3에 있습니다. '전체 표현식을 평가할 때 마지막 단계로 임시 개체가 소멸됩니다 (1.9) (어휘 적으로) 그들이 생성 된 지점을 포함합니다. ' – Pixelchemist

0

임시에 대한 참조가 정의되지 않았다고 생각하지 않습니다. 단지 금지되어 있습니다. 또한 이것은 함수 인수에만 적용됩니다. Visual Studio에서는 gcc가 아는 것은 아니지만 기본 경고/오류 수준에서 const가 아닌 임시 참조를 전달할 수 있습니다.

내가 아는 한, 그렇게하는 것은 프로그래머가 범위를 벗어나는 임시 참조를 저장하여 발을 쏘지 않기 때문에 금지됩니다. 이것을 C++로 보았을 때, 나는 매우 어리 석다는 것을 알았습니다.

내가하는 일에 어떤 문제도 나타나지 않습니다.

1

임시 변수 인 경우에도 모든 구성원이 임시적이라는 의미는 아닙니다. 임시 개체의 범위 내에서 this 포인터와 다른 구성원은 일시적이지 않습니다. 코드가 완벽합니다. 이제 다음과 같이하면 :

SomeFunc(&CCircleSetter(myCircle)) 

이것은 임시 변수를 나타냅니다.

0

내가이 유용성 POV에서 잘 생각

if(istream.operator>>(a).operator>>(b).operator some_bool_like_type()) 

과 동일하다 기본적으로

if(istrm >> a >> b) ... 

동일하다. (확실히 아무 의미/구문 문제가 없습니다.)

그러나, 항상 부울에 암시 적 변환이 약간 불쾌한 한, 예기치 않은 코드를 컴파일 할 수 있기 때문에 :

if (CCircleSetter(myCircle).Radius(10) != 10) 
+0

네, 같은 것. 그러나이 예제에서 istream은 "if"표현식 안에 만들어진 변수가 아닙니다. istream을 호출하는 생성자/소멸자가 없습니다. 그게 내 질문의 핵심 이었어. 예기치 않은 코드의 경우 : (true! = 10) is legal expression? – SadSido

+0

@SadSido :'bool'은 암시 적으로'int'로 변환됩니다, 그래서 이것이 컴파일되어야한다고 생각합니다. 그러나 그렇지 않은 경우에도 '조작자 bool'은 의미있는 짐승입니다. 나는 창조주가'<'을 과부하하는 것을 잊어 버린 스마트 포인터 구현을 한 번 보았습니다. 'std :: map'에 그것들을 채웠을 때,'operator bool'이 "rescue"에 왔고, map이 그 결과를 비교했습니다. 빈 포인터는 비어 있지 않은 포인터보다 작았고 비어 있지 않은 포인터는 모두 동일했습니다. 그래서 당신은지도에서 최대 2 항목으로 끝났습니다. 누락 된 비교 연산자를 찾을 때까지는 디버깅하는 데 시간이 걸렸습니다 ... – sbi

관련 문제