2010-06-12 15 views
5

मैं संदर्भों के साथ खेल रहा हूं (मुझे अभी भी इस संबंध में समस्याएं हैं)।क्या मैं यहां कुछ गलत कर रहा हूं (सी ++ में संदर्भ)?

1- मैं अगर यह एक स्वीकार्य कोड है जानना चाहूंगा:

int & foo(int &y) 
{ 
    return y; // is this wrong? 
} 

int main() 
{ 
    int x = 0;  
    cout << foo(x) << endl; 

    foo(x) = 9; // is this wrong? 
    cout << x << endl; 

    return 0; 
} 

2- इसके अलावा इस एक परीक्षा नमूना से है:

Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    Week max = aYear[0]; 
    for(int i = 1; i < 52; i++) 
    { 
    if (aYear[i].getSales() > max.getSales()) 
     max = aYear[i]; 
    } 
    return max; 
} 

यह इस कोड में गलती के बारे में पूछता है , इसे कैसे ठीक करें।

मेरा अनुमान है कि यह एक स्थानीय संदर्भ लौटाता है। फिक्स है:

Week & max = aYear[0]; 

क्या यह सही/पर्याप्त है?

उत्तर

5

पहला वाला सही है।

दूसरा एक के लिए, वहाँ समाधान के :) अनंत संख्या हैं, लेकिन यह मेरा होगा:

Week Week::highestSalesWeek(Week aYear[52]) // return a copy of the week 
{ 
    Week max = aYear[0]; 
    for(int i = 1; i < 52; i++) 
    { 
    if (aYear[i].getSales() > max.getSales()) max = aYear[i]; 
    } 
    return max; 
} 

तो अधिकतम एक संदर्भ है, तो आप ayear हर के पहले तत्व आप कर संशोधित करेगा:

max = aYear[i] 

इसके अलावा, आप सप्ताह के लिए एक संदर्भ वापस जाने के लिए एक सूचक इस्तेमाल कर सकते हैं:

Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    Week* max = &aYear[0]; 
    for(int i = 1; i < 52; i++) 
    { 
    if (aYear[i].getSales() > max->getSales()) max = &aYear[i]; 
    } 
    return *max; 
} 
+1

आप सही थे। मैंने शर्मनाक तरीके से झुकाया, धनुष के लिए – zildjohn01

+0

+1, लेकिन मैं थोड़ा असहमत हूं: सीखने के बारे में कुछ भी शर्मनाक नहीं है। आप फिर कभी गलती नहीं करेंगे। :-) – Thanatos

+0

एक सूचक क्यों शामिल है? एक स्थानीय संदर्भ बेहतर लगता है। –

1

foo(x) = 9; // is this wrong? 

मैं कहूंगा कि हाँ, यह है कि यह मतलब नहीं है, हालांकि यह वाक्य रचना मान्य है गलत है: आपके सवालों के जवाब। और अपने "परीक्षा" सवाल (जो इस चीज पूछ रहा है?) के लिए के रूप में:

Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    Week max = aYear[0]; 
    for(int i = 1; i < 52; i++) 
    { 
    if (aYear[i].getSales() > max.getSales()) max = aYear[i]; 
    } 
    return max; 
} 

खैर, पैरामीटर पर सरणी आयाम प्रदान व्यर्थ है, और कोड स्पष्ट रूप से एक सदिश का उपयोग करना चाहिए। और सुधार समारोह के हस्ताक्षर में होना चाहिए:

Week Week::highestSalesWeek(Week aYear[52]) 

दूसरे शब्दों में - एक मूल्य वापस करें। संदर्भों के बजाय आपको हमेशा मूल्यों को हमेशा वापस करना चाहिए - संदर्भ पैरामीटर पैरामीटर के लिए हैं।

+0

रिटर्न प्रकार के रूप में संदर्भ 'ऑपरेटर [] '; ओवरलोडिंग करते समय आसान होते हैं; – fredoverflow

+0

@Fred बेशक - यही कारण है कि मैंने" लगभग हमेशा "कहा। उपयोगकर्ताओं के मामले में ऐसा व्यर्थ है। –

+0

और 'ऑपरेटर =' को ओवरलोड करना, लेकिन ईमानदार होने के लिए, मुझे अभिव्यक्ति के रूप में असाइनमेंट का उपयोग करना पसंद नहीं है। – fredoverflow

2

संदर्भों के बारे में महत्वपूर्ण बात हमेशा यह सुनिश्चित कर रही है कि संदर्भ उस वस्तु के लिए नहीं है जो दायरे से बाहर हो गया है।

अपने दूसरे उदाहरण के साथ समस्या यह है कि:

Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    Week max = aYear[0]; 
    return max; 
} 

max कि विधि के लिए एक स्वचालित चर स्थानीय है। जब वह विधि गुंजाइश से बाहर हो जाती है, max गुंजाइश से बाहर हो जाती है और अब आपके कोड में यादृच्छिक स्मृति का संदर्भ है।

चूंकि आपका कोड max को पुन: असाइन करना जारी रखना चाहता है, इसलिए आप संदर्भ का उपयोग नहीं कर सकते हैं (प्रारंभिक असाइनमेंट के बाद से, आप केवल संदर्भित किए गए संदर्भ को संशोधित कर सकते हैं, संदर्भ स्वयं नहीं)। आपको aYear के वास्तविक भाग को ट्रैक रखने की आवश्यकता है जिसे आप संदर्भ वापस करना चाहते हैं। दो सुझाव

// By pointer 
Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    Week *max = &aYear[0]; 
    ...; 
    return *max; 
} 

// By index 
Week & Week::highestSalesWeek(Week aYear[52]) 
{ 
    size_t max_idx = 0;; 
    ...; 
    return aYear[max_idx]; 
}  
संबंधित मुद्दे