[C++] Przeciążenie operatora []
Ostatnio zmodyfikowano 2015-01-07 16:34
Lukier Temat założony przez niniejszego użytkownika |
[C++] Przeciążenie operatora [] » 2015-01-05 19:51:29 Witam. Mam pewien problem odnośnie przeciążenia operatora [] i nie mogę znaleźć błędu. Kompiluje się program, wszystko jest ok, ale nie działa sama funkcja przeciążająca. Możliwe, że problem leży w wywoływaniu danego przeciążenia (w funkcji print), no ale do końca nie jestem pewien. Prosił bym o pomoc w znalezieniu błędu. #include<iostream> using namespace std;
class A { int v; public: void set( int i ) { v = i; } A() { v = 0; } int get() { return v; } friend class B; };
class B { A * no; int size; int l; int z; public: B() { no = new A(); size = 0; } B( int j ) { l = z = 0; no = new A[ j ]; size = j; for( int i = 0; i < j; i++ ) { no[ i ].set( i ); } } friend ostream & operator <<( ostream & wyjscie, B * obiekt ); friend istream & operator >>( istream & wejscie, B * obiekt ); ~B() { delete[] no; } B & operator =( B * obiekt ) { for( int i = 0; i < size; i++ ) { no[ i ].set( 1 ); } return * this; } A & operator []( int dup ) { if( dup < 0 || dup >= size ) { cout << "Nie dozwolony index" << endl; exit( 0 ); } return no[ dup ]; } void print( int i ) { cout << "no[i].v: " << no[ i ].v << endl; } A * operator ->() { return & no[ 3 ]; } int operator ()() { int x = 0; for( int i = 0; i < size; i++ ) { x = x + no[ i ].get(); } return x; } };
ostream & operator <<( ostream & wyjscie, B * obiekt ) { for( int i = 0; i < obiekt->size; i++ ) { wyjscie << obiekt->no[ i ].get() << endl; } return wyjscie; }
istream & operator >>( istream & wejscie, B * obiekt ) { int k; cin >> k; for( int i = 0; i < obiekt->size; i++ ) { obiekt->no[ i ].set( k ); } return wejscie; }
void main() { B * obiekt; obiekt = new B( 10 ); cout << obiekt << endl; B * obiekt2; obiekt2 = new B( 7 ); cin >> obiekt2; cout << obiekt2 << endl; ( * obiekt ) = obiekt2; cout << " = " << endl << obiekt << endl; cout << " [] "; obiekt->print( 50 ); cout << " -> " <<( * obiekt )->get() << endl; cout << " () " <<( * obiekt2 )() << endl; } |
|
darko202 |
» 2015-01-06 01:03:46 >>Możliwe, że problem leży w wywoływaniu danego przeciążenia (w funkcji print), no ale do końca nie jestem pewien. cout << " [] "; obiekt->print( 50 );
cout << "no[i].v: " << no[ i ].v << endl;
A * no;
B( int j ) {... no = new A[ j ]; ...}
B * obiekt; obiekt = new B( 10 );
|
|
Lukier Temat założony przez niniejszego użytkownika |
» 2015-01-06 10:05:33 No tak, nie istnieje i powinna mi moja funkcja przeciążająca zwrócić cout, że nie istnieje i zakończyć działanie programu w momencie kiedy odwołuję się do indeksu z poza granicy no[50].v lecz program zachowuję się tak jakby zdefiniowane przeze mnie przeciążenie nie istniało, czyli się zawiesza bo odwołuje się do nie zaalokowanego przeze mnie fragmentu pamięci. Nie rozumiem dlaczego tak się dzieje, z mojego punktu widzenia wszystko wygląda poprawnie. |
|
1aam2am1 |
» 2015-01-06 10:17:07 zamiast exit(0); wstaw pause do czasu aż nie wciśniesz klawisza, bo cout może nie zdążyć wyświetlić ci danej rzeczy na ekranie przed zakończeniem działania programu Możesz użyć std::cerr zamiast std::cout do wyświetlania błędów |
|
Lukier Temat założony przez niniejszego użytkownika |
» 2015-01-06 10:35:49 Dzięki za rady lecz niestety nie rozwiązuje to mojego problemu ponieważ jak wspomniałem wyżej program zachowuje się cały czas tak jakby moja funkcja przeciążająca nie istniała. |
|
1aam2am1 |
» 2015-01-06 11:10:08 void print( int i ) { cout << "no[i].v: " << no[ i ].v << endl; }
Mam małe pytanie? Nie dziw że operator nie jest używany. jak go nie używasz (nie używasz operatora []) |
|
Lukier Temat założony przez niniejszego użytkownika |
» 2015-01-06 12:35:04 Tak właśnie myślałem, że to może być powodem. Czyli jak mam go aby funkcja przeciążająca poprawnie mi sprawdzała czy nie przekraczam zakresu tablicy elemencie klasy no? Nie rozumiem tego za bardzo. |
|
1aam2am1 |
» 2015-01-06 15:54:37 void print( int i ) { cout << "no[i].v: " <<( * this )[ i ].v << endl; }
|
|
« 1 » 2 |