2014-04-18 2 views
0

동일한 개체 (동일한 주소 사용)를 다른 함수로 저장해야하므로 코드 (아래쪽)와 포인터 (TRequest 개체)에 대한 참조를 저장하는 방법은 무엇입니까?함수에서 포인터에 대한 참조

void producent(const TRequest *(* dispatcher)(void)) { 
    // ... 
    const TRequest *& tmpRequest2 = *(dispatcher()); // that is bad 
    // ... 
} 
+0

'std :: bind'와 함께'std :: function'을 사용하지 않는 이유는 무엇입니까? –

답변

0

귀하의 tmpRequest2는 const TRequest * 유형이어야합니다. (앰퍼샌드없이 반환 된 값을 역 참조하지 마십시오.) 함수에서 반환 된 포인터에 대한 참조 (임시 참조)를 만들지 않으므로. 실제 값이 저장되지 않기 때문에 기존 값이 아닌 값에 대한 참조가됩니다. 접근 방식은 단순히 저장하고이 경우 포인터 포인트 이런 식으로 뭔가 될 것이라고에서의 값에 대한 참조를 참조를 사용하는 : 임시은 (a const를 TRequest * 여기)

 const TRequest *tmpRequest2Ptr = (dispatcher()); 
    if (tmpRequest2Ptr != nullptr) 
    { 
     const TRequest & tmpRequest2 = *tmpRequest2Ptr; 
     // do something with tmpRequest2 
    } 
0

반환 값. 참조를 임시로 저장하면 안됩니다.

세 가지 옵션 :

  • 에 대한 참조를 보관하지 마십시오, 저장하는 대신 포인터를 직접

const를 TRequest * tmpRequest2 = * (디스패처());

  • 반송파 유형을 변경하고 포인터에 대한 참조를 반환하십시오. 즉, 참조가 반환되는 실제 포인터는 영구 위치에 저장되어야합니다.

무효 PRODUCENT (const를 TRequest * & (* 디스패처) (무효)) {

  • 저장합니다 포인터의 결과 (그리고 포인터에 대한 심판)과를 만들 그것에 대한 참조 (그러나 저장된 포인터는 그 경우에 유효해야합니다). 왜 당신은 단순히 다른 함수에 포인터를 보낼 수 없습니다 나는이 문제를 해결할 것이라고 생각하지 않지만 그건 그냥 이해

    //tmpRequest2 must remain in scope during the use of tmpRequest3 
    const TRequest * tmpRequest2 = *(dispatcher()); 
    const TRequest *& tmpRequest3 = tmpRequest2; 
    

위한거야? 다른 함수가 포인터를 수정하거나 단순히 TObject에 액세스해야합니까?

관련 문제