2012-06-02 12 views
5

Ćwiczę przeciążanie operatorów w C++ już teraz i mam problem. Stworzyłem klasę String, ma ona tylko do pól jeden jest char tablicą inny jest długość. Mam ciąg "Alice ma kota" i gdy zgłoszęPrzeciążanie operatora w C++ i dereferencji

cout<<moj[2]; 

Chciałbym dostać 'i', ale moj teraz jestem coraz + 16U adres MOJ + 2 sizeof (String) Kiedy Ja nazywam

działa tak, jak to jest, ale chciałbym usunąć go z definicji operatora przeciążonego. Próbowałem wielu rzeczy, ale nie mogę znaleźć rozwiązania. Proszę mnie poprawić.

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

I cały kod, ważne rzeczy są na stronie. Kompiluje się i działa.

#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

Trzeba usunąć moj ';' przed powrotem. – Matt

+0

Usunąłem go, więc jest najmniejszy kod. – Yoda

Odpowiedz

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 

To nie może być zrobione, operator indeks w tym ostatnim przypadku stosuje się wskaźnik. Możliwe jest przeciążenie operatorów tylko wtedy, gdy przynajmniej jeden z argumentów jest typu zdefiniowanego przez użytkownika (lub odniesienie do niego, ale nie wskaźnik); w tym konkretnym przypadku argumenty są oba typy podstawowe.

Co można zrobić, to spadek wskaźnika w ogóle, ja nie rozumiem, dlaczego trzeba go:

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

String * oznacza wskaźnik do String, jeśli chcesz zrobić coś z samego cię String musicie usunąć dereferencję za pomocą *moj. Co można zrobić, a nie jest to:

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

Należy również pamiętać, że wszystko można przydzielić z new potrzeby zostać usunięte po:

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

// code 

delete x; 
Powiązane problemy