2009-12-02 116 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; 
    } 
}