【问题标题】:C++ pass pointer by reference and assign default valueC ++通过引用传递指针并分配默认值
【发布时间】:2010-12-22 06:00:27
【问题描述】:

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

类似这样的:

在声明中

void myFunc(SomeType* &var=NULL);

以及定义:

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

    if(someCondition)
        var=NULL;
}

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

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

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

感谢您的帮助!

【问题讨论】:

    标签: c++ reference pointers default-value


    【解决方案1】:

    NULL 不是左值 - 它不能通过引用传递。这就像将 4 传递给需要 int& 的函数。

    'int' 部分是因为 NULL 是一个宏 - 定义了 0

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

    【讨论】:

    • 另一种选择是使用 boost::optional(没有双关语)
    • ... 或者只是重载函数以提供无参数版本。
    【解决方案2】:

    错误消息说明了一切:您传递的是整数而不是指向 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;
    }
    

    【讨论】:

    • 除非“someCondition”包含“var!=NULL”,否则您只是接受了一个取消引用 NULL 指针的答案。可能不是你想要的。
    • 另外,请注意使用 (**var)=(*someOtherPointer) 实际上会执行对象复制。如果您只想复制指针,您可能需要 (*var) = (someOtherPointer)。
    【解决方案3】:

    您也可以考虑使用 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
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        为什么不直接重载函数呢?

        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;
           }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-14
          • 2012-03-03
          • 2014-09-11
          • 1970-01-01
          相关资源
          最近更新 更多