2009-12-02 2 views
6

전달 된 포인터가 가리키는 주소를 실제로 변경할 수 있도록 함수에 대한 참조로 포인터를 전달하고 싶습니다.이 인수를 기본값으로 할당하고 싶습니다. 값. 이 같은C++에서 참조로 포인터 전달 및 기본값 할당

뭔가 : 선언

void myFunc(SomeType* &var=NULL); 

과 정의에

: 피 호출자 그는 하나 개의 인수로 함수를 호출하고 싶어 여부를 결정할 수 있습니다

void MyClass::myFunc(SomeType* &var){ 
    if(var!=NULL) 
     (*var)=(*someOtherPointer); 

    if(someCondition) 
     var=NULL; 
} 

하도록하거나 논증없이. 그리고 그가 인수를 전달하기로 결정하고, someCondition가 보유하고있는 경우, 전달 된 포인터가 그러나 이후

을 NULL로 가리 킵니다 것을 sucht -이 같은 그것을하려고하면 내가 얻을 :

오류 C2440 : '기본 인수 ':'int '를'SomeType * & '

도와 주셔서 감사합니다.

답변

7

오류 메시지가 말하는대로 : 포인터 - 투 - SomeType에 대한 참조 대신 정수를 전달합니다. 당신이 원하는 것을 수행하려면, 당신은 사용할 수있는 포인터 - 투 - 투 - SomeType A-포인터 : 옵션

void myFunc(SomeType** var=NULL); 

void MyClass::myFunc(SomeType** var){ 
    if(var!=NULL && *var!=NULL) 
     (**var)=(*someOtherPointer); 

    if(var!=NULL && someCondition) 
     *var=NULL; 
} 
+0

"someCondition"에 "var! = NULL"이 포함되어 있지 않으면 방금 NULL 포인터를 참조 해제하는 대답을 수락했습니다. 아마도 당신이 원하는 것이 아니 겠지요. – imaginaryboy

+0

또한 (** var) = (* someOtherPointer)를 사용하면 실제로 객체 복사가 수행됩니다. 포인터 복사 만하려는 경우 (* var) = (someOtherPointer)를 원할 수 있습니다. – Thought

14

NULL은 lvalue가 아닙니다. 참조로 전달할 수 없습니다. 을 int&이 필요한 함수에 전달하는 것과 같습니다.

NULL0 매크로로 정의되어 있기 때문에 'int'부분이 있습니다.

가장 좋은 방법은 포인터를 참조 (즉, 이중 포인터)로 전달하는 것입니다. 그런 다음 매개 변수가 NULL이면 아무 것도 전달되지 않습니다. 그렇지 않은 경우, someCondition이 보유하고 있으면 NULL을 가리 키도록 수정해야하는 포인터의 주소입니다.

+0

+1 너무 빨리 받으실 수 있습니다.) – AraK

+0

불면증. – aib

+1

또 다른 옵션은 boost :: optional (의도적 인 말장난 없음) –

2

는 또한 부스트를 사용하여 고려할 수 있습니다 : (하지 사용할 수있는 간단한 코드 만 옵션)이 : 당신이 C++ 뇌를 운동의 관점에서이 작업을 수행 할 것 왜 좋아

void f(boost::optional<int&> r = boost::optional<int&>()) 
{ 
    if (r) *r = 5; 
} 
int main() 
{ 
    int x = 0; 
    f(x); std::cout << x << std::endl; // 5, it did change the value 
    f(); // compiler will default to an empty optional<int&> object 
} 
+0

+1 예를 들어. –

2

, 내가 볼 수 있습니다,하지만 당신은 정말 프로덕션 코드에서 그렇게 할 것인가? 1 년 후 동료로서 코드를 볼 때, 부작용이있는 매우 안개 낀 기법처럼 보입니다. 명확한 이름과 포인터를 반환하는 함수와 다른 필요한 작업을 수행하는 두 개의 함수를 사용한다고 생각하십니까?

2

왜 함수에 과부하가 걸리지 않습니까?

void myFunc() { 
    //whatever logic should happen if a null pointer is passed in 
} 

void myFunc(SomeType* &var) { 
    if(var!=NULL) { 
    (*var)=(*someOtherPointer); 
    } 

    if(someCondition) { 
     var=NULL; 
    } 
}