2016-01-04 10 views
8

मैं एक टेम्पलेट वर्ग सरणी है:सी ++ - ओवरलोडिंग [] ऑपरेटर

template <class T=int, int SIZE=10> 
class Array { 
    T TheArray[SIZE]; 
public: 
    void Initialize() { 
     for (int idx=0; idx < SIZE; idx++) { 
      TheArray[idx] = T(); 
     } 
    } 

    T& operator [](int idx) { 
     return TheArray[idx]; 
    } 

    T operator [](int idx) const { 
     return TheArray[idx]; 
    } 
} 

मैं ऑपरेटर [] अधिक भार पर कुछ सवाल हैं (मैं नेट पर इस उदाहरण पाया जाता है)।

मुझे लगता है कि T& operator [](int idx) इंडेक्स idx के साथ सरणी मान का संदर्भ देता है और T operator [](int idx) const इसका मूल्य देता है। हालांकि, मुझे यकीन नहीं है कि [] ऑपरेटर का उपयोग करके मुझे कौन सा केस संदर्भ या मान वापस कर दिया जाएगा।

इसके अलावा, अगर मैं T operator [](int idx) const ->T operator [](int idx) बदलता हूं, तो संकलक शिकायत करता है। ऐसा क्यों है? मैं समझ सकता हूं कि कंपाइलर शिकायत करता है क्योंकि केवल वापसी प्रकार अलग है, लेकिन const को कब जोड़ा जाता है जब यह शिकायत नहीं करता है? इसका मतलब यह है कि कक्षा के इंटर्न के गैर संशोधित नहीं हैं, है ना?

मैं इस छोटे से मुख्य कार्यान्वयन डिबग करने की कोशिश की:

int main() { 
    int val; 
    Array<> intArray; 

    intArray.Initialize(); 
    val = intArray[1]; 
    printf("%d", intArray[1]); 
    intArray[1] = 5; 
} 

और हर बार T& operator [](int idx) कहा जाता है। क्यूं कर?

अग्रिम धन्यवाद।

+0

एक तरफ ध्यान दें, 'प्रारंभिक' जैसे कार्यों के लिए उचित रचनाकारों को प्राथमिकता दें। सी ++ आपको ऑब्जेक्ट प्रारंभ करने के लिए एक आदर्श टूल देता है, और इसे कन्स्ट्रक्टर कहा जाता है। – SergeyA

उत्तर

12

operator[] अधिभार const के आधार पर चुना जाएगा - जिस ऑब्जेक्ट को आप इसे कॉल करते हैं उसका अयोग्यता।

Array<> intArray; 
intArray[1]; //calls T& operator[] 

const Array<> constArray; 
constArray[1]; //calls T operator[] 

आप निकालते हैं constT operator[] से आपको एक त्रुटि क्योंकि सदस्य कार्यों में एक ही const -qualification और पैरामीटर नहीं कर सकते हैं के रूप में उन दोनों के बीच चयन करने के लिए कोई रास्ता नहीं होगा मिलता है।

12

पहली बात, []this->operator[] पर कॉल करने के लिए वाक्य रचनात्मक चीनी के रूप में।

अगर this एक const सूचक है, और गैर const संस्करण कहा जाता हो जाएगा const संस्करण बुलाया जाएगा।

आगे बढ़ना, आपको const T& operator [](int idx) const { का उपयोग करना चाहिए, यानी const संस्करण const संदर्भ देता है। इससे गहरी प्रतिलिपि लेने के ऊपरी हिस्से को बचाया जाएगा।

अंत में, const -एक फ़ंक्शन की समस्या इसके हस्ताक्षर का हिस्सा है। यह आपको const -ness के आधार पर अधिभारित करने की अनुमति देता है। अन्यथा आपके पास operator[] के दो संस्करण नहीं हो सका।

+1

मैं यहाँ एक डिजाइन गंध/बग के संदर्भ में अस्थायी लौटने पर भी कॉल करता हूं, क्योंकि यह असंगतता की ओर जाता है, यानी: [मैं memcpy में कॉन्स्ट तर्कों का उपयोग क्यों नहीं कर सकता?] (Http://stackoverflow.com/q/ 17669913/1942027) किसी को आश्चर्यजनक व्यवहार को रोकने के लिए मानक लाइब्रेरी पर उन्मुख होना चाहिए और ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector/operator_at) एक कॉन्स्ट संदर्भ देता है । –

संबंधित मुद्दे