2015-10-29 16 views
8

में संदर्भ विकल्पों द्वारा उत्तीर्ण करना मैं कक्षा ए के किसी ऑब्जेक्ट को पास करना चाहता हूं (व्यापक रूप से, यानी ए & या ए * द्वारा) किसी अन्य कक्षा बी के निर्माता को। नहीं चाहते कि 'ए' को बी के अंदर संशोधित किया जाए ('ए' केवल पढ़ा जाता है और यह आकार में बड़ा है इसलिए मैं इसे संदर्भ से पास करना चाहता हूं)। मैं दो विकल्पों में से जानते हैं:सी ++

1) पास 'एक' के रूप में

const A & a_ 

2) दर्रा 'एक'

रूप
const A * a_ 

विकल्प 1 का नुकसान यह है कि मैं गलती से किसी से पारित सकता है आर-मूल्य। विकल्प 2 का नुकसान यह है कि मैं गलती से एक शून्य सूचक पास कर सकता हूं।

मेरे प्रश्न हैं: 1) क्या मैं उपरोक्त नुकसान के बारे में सही हूं? 2) क्या संदर्भ द्वारा 'ए' पास करने का कोई और अनुशंसित तरीका है?

मैंने नीचे दिए गए लिंक में उत्तरों को देखा। लेकिन अगर मैं उस प्रश्न में पोस्ट की गई तुलना में अन्य विकल्प हैं तो मैं उत्सुक हूं। Are there benefits of passing by pointer over passing by reference in C++?

+5

कैसे संभावित यह है कि आप गलती से एक आर-मूल्य पारित करेंगे, और कैसे गंभीर है कि कार्रवाई के परिणामों हो जाएगा? – emlai

+1

यदि आपकी चिंताएं हैं, और आप समस्याओं को जानते हैं, तो आपको त्रुटि जांच की आवश्यकता है। संदर्भ द्वारा पास करें और कोशिश करें/पकड़ें। यदि आप इसे पॉइंटर द्वारा करते हैं, तो आप अपनी ऑब्जेक्ट के मूल उदाहरण को संशोधित करेंगे। –

+1

एक रैल्यू क्या है? क्या यह एक अनिर्धारित समानता है? एक लालसा की तरह? –

उत्तर

18

const A & द्वारा पास किया गया।

आप उस कार्य = delete के एक रावल्यू ओवरलोड को घोषित करके राजस्व के आकस्मिक गुजरने से रोक सकते हैं। उदाहरण के लिए:

struct A { }; 

void func(const A & a) { } 
void func(A && a) = delete; 

int main() 
{ 
    A a; 
    func(a); // compiles 
    func(A()); // doesn't compile 
} 
+1

एक मुश्किल मुद्दा है जिसे मैंने इस से निपटने के दौरान उछाल दिया: यदि आप वास्तव में * सभी * रावल्यू को अक्षम करना चाहते हैं, तो 'void func (const a &&) = delete;' का उपयोग करना बेहतर है। अजीब और गंदा लग रहा है, लेकिन यह नौकरी करता है।ऐसा इसलिए है क्योंकि अन्यथा विरासत कोड जो 'const' मान द्वारा लौटाया जाता है (अनुशंसित नहीं है, लेकिन दुर्भाग्यवश अक्सर फैक्ट्री-जैसी फ़ंक्शंस में उपयोग किया जाता है)' func (const &); 'इसके बजाय बाध्य होगा। संबंधित: http://stackoverflow.com/q/33244951/3093378 – vsoftco

4

std::reference_wrapper के निर्माताओं पर एक नज़र डालें: http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper/reference_wrapper

यह एक अतिरिक्त नष्ट कर दिया निर्माता कि rvalue संदर्भ लेता है, इसलिए यदि आप इसे करने के लिए एक rvalue पारित करने के लिए प्रयास करते हैं, कि निर्माता अधिभार संकल्प जीतता है और आप मिल एक त्रुटि।

आप एक ही काम कर सकते हैं: const A& और A&& रचनाकार दोनों घोषित करें, और बाद वाले को हटाएं। तब कोई भी एक रावल में गुजरने में सक्षम नहीं होगा।

-3

कोड:

#include <iostream> 
using namespace std; 

struct A 
{ }; 

int func_one(A& var) { 
    A * insertVal=new A; 
    if (&var==nullptr) 
     return 0; 
    else 
     return 1; 
} 

int main() { 
    A refVar; 
    int x; 
    x=func_one(refVar); 

    return 1; 
} 
+2

यह संकलित नहीं करता है। – emlai

+0

क्यों? कोई संरचना नहीं? –

+2

इसे संकलित करने का प्रयास करें, देखें कि आपको कौन सी त्रुटियां मिलती हैं, और पहले उन्हें ठीक करें। अमान्य कोड के साथ कोड-केवल उत्तर बहुत उपयोगी नहीं है। – emlai