C ++通过引用传递指针并分配默认值

时间:2009-12-02 01:04:31

标签: c++ reference pointers default-value

我想通过引用函数传递一个指针,这样我实际上可以改变传递指针所指向的地址,并且我想为这个参数赋一个默认值。

类似的东西:

宣言中的

void myFunc(SomeType* &var=NULL);

和定义:

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

    if(someCondition)
        var=NULL;
}

这样被调用者可以决定是否要用一个参数或没有参数调用该函数。并且如果他决定传递一个参数,并且someCondition成立,则传递的指针将在之后指向NULL

但是 - 如果我尝试这样做,我会得到:

错误C2440:'默认参数':'int'无法转换为'SomeType *&'

感谢您的帮助!

5 个答案:

答案 0 :(得分:14)

NULL不是左值 - 它不能通过引用传递。这就像将4传递给期望int&

的函数

'int'部分是因为NULL是宏定义的0

您最好的选择是使用指针通过引用传递指针,即双指针。然后,如果参数是NULL,则不会传递任何内容。如果不是,那就是应该修改的指针的地址[如果someCondition成立则指向NULL]。

答案 1 :(得分:7)

错误消息说明了一切:您传递的是整数,而不是指向SomeType的引用指针。要做你想做的事,你可以使用指针指向SomeType:

void myFunc(SomeType** var=NULL);

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

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

答案 2 :(得分:2)

您还可以考虑使用boost :: optional(不是您可以使用的最简单的代码,但选项就在那里):

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
}

答案 3 :(得分:2)

好的,我可以从运用C ++大脑的角度来看你为什么这样做,但你真的会在生产代码中这样做吗?在1年后作为同事查看代码时,它看起来像一种带有副作用的令人难以置信的迷雾技术。您是否考虑使用两个具有明确名称的独立函数,一个返回指针,另一个执行其他所需的工作?

答案 4 :(得分: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;
   }
}