我想通过引用函数传递一个指针,这样我实际上可以改变传递指针所指向的地址,并且我想为这个参数赋一个默认值。
类似的东西:
宣言中的
void myFunc(SomeType* &var=NULL);
和定义:
void MyClass::myFunc(SomeType* &var){
if(var!=NULL)
(*var)=(*someOtherPointer);
if(someCondition)
var=NULL;
}
这样被调用者可以决定是否要用一个参数或没有参数调用该函数。并且如果他决定传递一个参数,并且someCondition成立,则传递的指针将在之后指向NULL
但是 - 如果我尝试这样做,我会得到:
错误C2440:'默认参数':'int'无法转换为'SomeType *&'
感谢您的帮助!
答案 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;
}
}