2009-12-02 73 views
6

我想通过引用传递一个指针,这样我实际上可以更改传递指针指向的地址,并且想要将此参数指定为默认值值。C++通过引用传递指针并分配默认值

是这样的:

在声明

void myFunc(SomeType* &var=NULL); 

和定义

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

    if(someCondition) 
     var=NULL; 
} 

这样一个被叫方可以决定他是否要调用的函数用一个参数或没有争论。而sucht,如果他决定来传递参数,并someCondition持有,传递的指针会指向然而事后NULL

- 如果我尝试做这样我得到一个:

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

感谢您的帮助!

回答

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

除非“someCondition”包含“var!= NULL”,否则您只接受解除引用NULL指针的答案。可能不是你想要的。 – imaginaryboy 2009-12-02 05:06:16

+0

另外,请注意使用(** var)=(* someOtherPointer)实际上会执行对象副本。如果你只是想做一个指针副本,你可能想要(* var)=(someOtherPointer)。 – Thought 2013-12-24 00:39:07

14

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

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

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

+0

+1你明明这么快;) – AraK 2009-12-02 01:12:46

+0

失眠被诅咒。 – aib 2009-12-02 01:20:46

+1

另一种选择是使用boost :: optional(无双关语) – 2009-12-02 01:23:22

2

你也可以考虑使用boost ::可选的(不是你可以用最简单的代码,但选择有):

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

为例。 – 2009-12-02 05:49:06

2

好吧,我可以知道你为什么会做这样的锻炼C++大脑的观点,但你真的能做到在生产代码?这看起来像是一种令人难以置信的有副作用的技术,一年后作为同事查看代码。你是否想过使用两个独立的名字清晰的函数,一个返回一个指针,一个返回其他需要的工作?

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