6

我想通过引用一个函数来传递一个指针,这样我就可以实际更改传递的指针指向的地址,并且我想为这个参数分配一个默认值。

像这样的东西:

在声明中

void myFunc(SomeType* &var=NULL);

和定义:

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

    if(someCondition)
        var=NULL;
}

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

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

错误 C2440:“默认参数”:“int”不能转换为“SomeType *&”

谢谢您的帮助!

4

5 回答 5

14

NULL不是左值 - 它不能通过引用传递。这就像传递4给一个需要int&.

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

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

于 2009-12-02T01:09:14.500 回答
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;
}
于 2009-12-02T01:16:53.783 回答
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
}
于 2009-12-02T01:30:53.993 回答
2

好的,我可以从锻炼 C++ 大脑的角度理解您为什么要这样做,但是您真的会在生产代码中这样做吗?一年后作为同事查看代码时,它看起来像是一种令人难以置信的具有副作用的模糊技术。您是否想过使用两个具有明确名称的独立函数,一个返回指针,一个执行任何其他需要的工作?

于 2009-12-02T07:30:25.587 回答
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;
   }
}
于 2011-08-17T13:53:03.953 回答