2009-12-02 15 views
6

मैं किसी फ़ंक्शन के संदर्भ में एक पॉइंटर पास करना चाहता हूं, जैसे कि मैं वास्तव में पारित सूचक को इंगित कर सकता हूं और मैं इस तर्क को डिफ़ॉल्ट रूप से असाइन करना चाहता हूं मूल्य।सी ++ संदर्भ द्वारा पॉइंटर पास करें और डिफ़ॉल्ट मान असाइन करें

कुछ इस तरह:

घोषणा

void myFunc(SomeType* &var=NULL); 

और परिभाषा

: एक कॉल प्राप्त करने वाला फैसला कर सकते हैं

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

    if(someCondition) 
     var=NULL; 
} 

ऐसी है कि क्या वह एक तर्क के साथ समारोह कॉल करने के लिए करना चाहता है या तर्क के बिना। और sucht है कि अगर वह एक तर्क पारित करने के लिए फैसला करता है, और someCondition रखती है, पारित कर दिया सूचक हालांकि बाद में शून्य पर

इंगित करेगा - अगर मैं इस तरह करने की कोशिश मैं प्राप्त एक:

त्रुटि C2440: 'डिफ़ॉल्ट तर्क ':' int 'को' कुछ टाइप * & '

सहायता के लिए धन्यवाद नहीं दिया जा सकता है!

उत्तर

7

त्रुटि संदेश यह सब कहता है: आप संदर्भ-से-एक-पॉइंटर-टू-कुछ टाइप के बजाय एक पूर्णांक गुजर रहे हैं। तुम क्या चाहते करने के लिए, आप उपयोग कर सकते हैं एक सूचक-टु-ए-सूचक करने वाली 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

जब तक "कुछ शर्त" में "var! = NULL" शामिल नहीं है, तो आपने अभी एक उत्तर स्वीकार कर लिया है जो एक पूर्ण सूचक का संदर्भ देता है। शायद आप जो चाहते थे वह नहीं। – imaginaryboy

+0

इसके अलावा, ध्यान रखें कि (** var) = (* someOtherPointer) का उपयोग वास्तव में एक ऑब्जेक्ट प्रतिलिपि करेगा। यदि आप केवल पॉइंटर प्रतिलिपि करना चाहते हैं, तो आप शायद (* var) = (someOtherPointer) चाहते हैं।उदाहरण के लिए – Thought

14

NULL एक लाभा नहीं है - इसे संदर्भ द्वारा पारित नहीं किया जा सकता है। यह 4 को उस फ़ंक्शन में गुजरने जैसा होगा जो int& की अपेक्षा करता है।

'int' हिस्सा इसलिए है क्योंकि NULL एक मैक्रो-परिभाषित 0 है।

आपकी सर्वश्रेष्ठ शर्त संकेतक द्वारा पॉइंटर को पास करने के लिए एक सूचक का उपयोग करेगा, यानी एक डबल पॉइंटर। फिर, यदि पैरामीटर NULL है, तो कुछ भी पारित नहीं हुआ था। यदि नहीं, तो यह सूचक का पता है जिसे संशोधित किया जाना चाहिए [कुछ कंडिशन होने पर न्यूल को इंगित करने के लिए]।

+0

+1 आपको यह ठीक से मिला है;) – AraK

+0

अनिद्रा शापित हो। – aib

+1

एक और विकल्प बूस्ट :: वैकल्पिक (कोई पन इरादा नहीं) –

2

तुम भी बढ़ावा उपयोग करने पर विचार कर सकते हैं :: वैकल्पिक (नहीं सबसे सरल कोड का उपयोग कर सकते हैं, लेकिन विकल्प वहाँ है):

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

+1। –

2

ठीक है, मैं देख सकता हूँ तुम क्यों सी ++ मस्तिष्क कसरत के नजरिए से यह करते हैं चाहते हैं, लेकिन क्या तुम सच में उत्पादन कोड में क्या होता है कि? 1 साल बाद एक सहयोगी के रूप में कोड को देखते समय, यह दुष्प्रभावों के साथ अविश्वसनीय रूप से धुंधली तकनीक की तरह दिखता है। क्या आपने स्पष्ट नामों के साथ दो अलग-अलग कार्यों का उपयोग करने के बारे में सोचा था, एक पॉइंटर लौटा रहा था और कोई अन्य आवश्यक काम कर रहा था?

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; 
    } 
} 
संबंधित मुद्दे