2011-01-28 13 views
0

내가이 있습니다참조 및 포인터 함수 매개 변수

void f1(Obj*x){ 
if(x==0){return;} 
... 
} 

void f2(Obj&x){ 
... 
f1(&x); 
... 
} 

void f3(Obj*x){ 
... 
f2(*x); 
... 
delete x; 
} 

내가 F3에 대한 포인터를 전달할 것을 좋아하지 않아, 다음 다음에 주소를 데리고, 참조로 전달하는 그것을 값을 그것을 포인터로 전달하십시오.

f2가 포인터를 가져가는 것이 좋을까요?

+2

아니면 다른 사람들이 참조하는 것이 좋습니다. 'delete' 문은 더 나쁘지 만 감싸 져야합니다. – GManNickG

+0

참조로 모두 전달할 수 없습니까? –

+0

f2에는 결코 NULL을 사용하지 않아야하므로 계약서에 참조가 있습니다. 비 const을 취하도록 객체를 수정할 수 있습니다. f1을 사용하면 NULL을 전달하고 대소 문자를 처리 할 수 ​​있습니다. – CashCow

답변

0

클래스 인터페이스에 간단한 디자인을 사용하십시오. 특히, 포인터에 대한 참조를 선호하십시오.

대안이없는 경우에만 포인터를 매개 변수로 사용하십시오. 이 경우 포인터를 소유 한 사람을 정확히 기록하십시오 (일반적으로 호출자 - 따라서 은 일반적으로이므로 전달 된 포인터는 삭제하면 안됩니다).

+1

포인터를 소유 한 사람은 랩핑 된 클래스입니다. :) – GManNickG

+0

@GMan 예. 나는 "클래스 인터페이스에서 포인터 사용을 피하십시오"라는 스트레스를 가하고 싶습니다. –

0

정상적인 규칙은 참조를 할 수 있다면 그렇게하는 것입니다. 예제에서 f3의 경우, 포인터를 삭제한다는 사실은 함수가 포인터를 취하는 경우 훨씬 간단하다는 것을 암시합니다. 아무도 함수를 참조를 삭제할 것으로 기대하지 않기 때문입니다.

f2는 사용자가 NULL이 아닌 값을 전달하도록하므로 참조가 좋습니다. 아마도 추가 정보없이 const 수정하면 즉, f2가 비 const 메소드를 호출하여 Obj를 수정할 수 있습니다.

디자인이 f1, f2 및 f3과 같은 이름을 가진 좋은 것인지 확인하기가 어렵습니다. 때때로 이름이 모든 차이를 만들 수 있습니다. 예를 들어, f3의 이름이 "useAndDispose"이거나 이와 유사한 경우 함수의 호출자는 포인터가 사용 후 삭제된다는 것을 분명히합니다.

마찬가지로 함수가 사용자가 정리해야하는 리소스를 반환하는 경우 일반적으로 getSomething이 아닌 createSomething을 나타내는 이름이 좋습니다.

Daniel은 "일반적으로"전달 된 포인터를 삭제하지 않는다고 말했습니다. 결코 "결코"아닙니다. 이 함수는 구체적으로 클린업 함수이거나 워크 플로 상황 일 수 있습니다.이 워크 플로 상황에서 무언가가 돌아 다니고 처리됩니다.

나는 당신이 결코 당신의 코드를 본 사람이 그것을 기대하지 않을 것이기 때문에 (물론 그들의 주소를 가지고) 당신에게 전달 된 참조를 절대로 삭제해서는 안된다고 말할 것이다.

+0

+1, 함수 이름과 의미에 대해 강조하는 것이 좋습니다. (음, 안타깝게도 오늘 이미 일일 투표 한도에 도달 했으니, 내일 +1하겠다 ';-)') – peoro

0

포인터와 참조의 가장 큰 차이점은 참조는 NULL이 될 수 없다는 것입니다. 따라서 f2()의 매개 변수가 필수이면 참조로 전달해야합니다.

체크 아웃 this other questions.