2012-06-02 4 views
5

में ओवरलोडिंग ऑपरेटर मैं अभी सी ++ में ओवरलोडिंग ऑपरेटरों का अभ्यास कर रहा हूं और मुझे कोई समस्या है। मैंने स्ट्रिंग क्लास बनाया है, इसमें सिर्फ फ़ील्ड हैं, एक चार सरणी है, अन्य लंबाई है। मैं एक स्ट्रिंग है "एलिस एक बिल्ली है" और जब मैंसी ++ और अधिभार

cout<<moj[2]; 

फोन मैं पाने के लिए 'i' चाहते हैं, लेकिन अब मैं हो रही है moj + moj की 16U पता + 2 sizeof (स्ट्रिंग) जब मैं

cout<<(*moj)[2]; 

यह चौंकाने वाला काम करता है लेकिन मैं ओवरलोडेड ऑपरेटर परिभाषा में इसे कम करना चाहता हूं। मैंने कई चीजों की कोशिश की लेकिन मुझे समाधान नहीं मिला। कृप्या मुझे सही करें।

char & operator[](int el) {return napis[el];} 
const char & operator[](int el) const {return napis[el];} 

और पूरा कोड, महत्वपूर्ण चीजें पृष्ठ के नीचे हैं। यह संकलन और काम कर रहा है।

#include <iostream> 
    #include <cstdio> 
    #include <stdio.h> 
    #include <cstring> 
    using namespace std; 

class String{ 
public: 

//THIS IS UNIMPORTANT------------------------------------------------------------------------------ 
char* napis; 
int dlugosc; 
    String(char* napis){ 
    this->napis = new char[20]; 
    //this->napis = napis; 
    memcpy(this->napis,napis,12); 
    this->dlugosc = this->length(); 
} 

    String(const String& obiekt){ 
    int wrt = obiekt.dlugosc*sizeof(char); 
    //cout<<"before memcpy"<<endl; 
    this->napis = new char[wrt]; 
    memcpy(this->napis,obiekt.napis,wrt); 

    //cout<<"after memcpy"<<endl; 
    this->dlugosc = wrt/sizeof(char); 
    } 

    ~String(){ 
    delete[] this->napis; 
    } 

    int length(){ 
    int i = 0; 
    while(napis[i] != '\0'){ 
     i++; 
    } 
    return i; 
    } 
     void show(){ 
     cout<<napis<<" dlugosc = "<<dlugosc<<endl; 
} 


//THIS IS IMPORTANT 
    char & operator[](int el) {return napis[el];} 
    const char & operator[](int el) const {return napis[el];} 
}; 


    int main() 
    { 

    String* moj = new String("Alice has a cat"); 
    cout<<(*moj)[2]; // IT WORKS BUI 
// cout<<moj[2]; //I WOULD LIKE TO USE THIS ONE 


    return 0; 
    } 
+0

आप' होना चाहिए moj हटाएँ:

String moj = String("Alice has a cat"); // note lack of * and new cout << moj[2]; 

इसके अलावा कि कुछ भी आप आवंटित ध्यान दें new जरूरतों के साथ के बाद हटाए जाने के लिए। – Matt

+0

मैंने इसे हटा दिया है इसलिए कम से कम कोड है। – Yoda

उत्तर

8
String* moj = new String("Alice has a cat"); 
cout<<(*moj)[2]; // IT WORKS BUI 
// cout<<moj[2]; //I WOULD LIKE TO USE THIS ONE 

नहीं किया जा सकता है कि, बाद में मामले में सबस्क्रिप्ट ऑपरेटर एक सूचक लिए आवेदन किया है। ऑपरेटर को अधिभारित करना केवल तभी संभव होता है जब कम से कम एक तर्क उपयोगकर्ता परिभाषित प्रकार (या इसका संदर्भ, लेकिन सूचक नहीं) होता है; इस विशेष मामले में तर्क String* और 2 दोनों मौलिक प्रकार हैं। ,

String moj("Alice has a cat"); 
// cout<<(*moj)[2]; <-- now this doesn't work 
cout<<moj[2]; // <-- but this does 
3

String * एक String के लिए सूचक का मतलब है अगर तुम String ही आप के साथ कुछ भी करना चाहते हैं:

आप ऐसा कर सकते हैं क्या सूचक छोड़ पूरी तरह, मैं नहीं दिख रहा है यही कारण है कि आप इसकी आवश्यकता है *moj के साथ इसे अव्यवस्थित करना होगा। क्या आप के बजाय क्या कर सकते हैं यह है:; लौटने से पहले `

String *x = new String("foo"); 

// code 

delete x;