Przeładowanie operatora []

0

Dobry !

Mam sobie taką klasę:

class simple
{
public:
  char *data;
  simple() : data(0) {} ;
  char operator[](int index) { return data[index]; };
};

A dalej korzystam z przeładowanego operatora:

simple sim;
if(sim[5]  == 'f') return 0;

i wyskakuje mi błąd: "operator+ not implemented in type 'simple' for arguments of type 'int'". Co tu ma do rzeczy 'operator+' ? I czemu gdy napiszę tak:

if(sim.operator [](5)  == 'f') return 0;

wszystko się kompiluje ?

P.S.: Używam BCB 6.0

[dopisane]
wkradł się mały błąd [wstyd]
zamiast

simple sim

powinno być const simple sim

. Bez "const" wszystko chodzi elegancko... tylko czemu gdy to jest stała operator tak śmiesznie działa ?
0

Co do bledu to zmien sobie kompilator bo ja tu bledu nie widze, chyba ze reszta kodu w jakis dziwny sposób na to wplywa
a tak poza tym to jak juz skompilujesz i nie zarezerwujesz pamieci dla data to ci sie wszystko bedzie delikatnie sypalo exeption murowany :)

0

Też kiedyś próbowałem przeładować operator []. Działało to tylko poprzez .operator. Nie udało mi się tego ominąć :|.

0

W VC++ , bez const obydwa if'y działają bez żadnego błędu-warninga .
Po dodaniu const oczywiście pojawia się błąd . Tworzysz obiekt const , czyli obiekt stały , którego pola nie mogą się zmieniać . Teraz ten obiekt wywołuje swoją metodę , które NIE jest stała ( const , czyli metoda która na pewno nie zmienia żadnych pól obiektu ) !! Oczywiście ta metoda nie zmiania pól obiektu , ale mogłaby , gdyż nie jest stała . Żeby był porządeczek dla obiektu stałego można wywoływac tylko metody stałe , wtedy mamy pewność , że nie zostanie naruszona "stałość" obiektu . Błąd który wyskakuje w twoim kompilatorze jest dziwny ( wynika chyba z niedopracowania kompilatora ) , VC++ wyrzuca przynajmniej rozsądny bląd . Aby wszystko działało extra wystarczy napisać :

[code]class simple
{
public:
char *data;
simple() : data(0) {} ;
char operator[](int index) const { return data[index]; };
};[/code]

Oczywiście nie wykonuj takich porównań , zanim nie przypiszesz jakiejś pamięci do wskaźnika data .

0

Dzięki wszystkim za pomoc !

TrOuBLE masz rację brakuje const.
Tylko zastanawia mnie ten "operator+". To chyba kompilator coś knuje przeciwko mnie :> Może czas przejść na VC++ 6.0 ? Tylko CodeInsight będzie mi brakowało...

P.S.: O rezerwacji wskaźników to wiem - nie musicie mi takich rzeczy mówić :-) Po prostu nie chciało mi się w poście pisać normalnego konstruktora :-)

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1