Lora Temat założony przez niniejszego użytkownika |
[C++] Przeciążanie operatora [] - tablica wielowymiarowa » 2014-05-12 14:25:03 Witam.
Napisałem dwie klasy wektor i macierz. Macierz jest dwuwymiarową tablicą obiektów wektor, wektor składa się z tablicy dowolnej ilości liczb całkowitych, więc macierz jest tak jakby trójwymiarową tablicą liczb całkowitych:
class Wektor { protected: int size; int * x; public: Wektor(); Wektor( int size ); Wektor( const Wektor & w ); virtual ~Wektor(); const int & operator []( int i ) const; int & operator []( int i ); };
class Macierz : public Wektor { private: int wier; int kol; Wektor ** m; public: Macierz(); Macierz( int wier, int kol, int rozm ); Macierz( const Macierz & ma ); };
Tak przeciążam operator [] dla wektorów:
const int & Wektor::operator []( int i ) const { return x[ i ]; }
int & Wektor::operator []( int i ) { return x[ i ]; }
No i chciałbym teraz przeciążyć operator [] dla macierzy, tak żeby jak napiszę cout << macierz[ i ][ j ] (mam już przeciążone operatory <<), to żeby wypisało mi dany wektor, który jest na miejscu (i,j) macierzy. Tylko nie wiem jak to zrobić, ponieważ występują tu dwa operatory [][], a przecież nie mogę zrobić przeciążenia operator[][].
Z góry dzięki za pomoc.
|
|
DejaVu |
» 2014-05-12 14:30:49 Musisz zwrócić obiekt, który zawiera również przeciążony operator [].
const Wektor & Macierz::operator []( int i ) const { return m[ i ]; }
Wektor & Macierz::operator []( int i ) { return m[ i ]; }
|
|
Lora Temat założony przez niniejszego użytkownika |
» 2014-05-12 14:44:05 Ale on tu przyjmuje tylko argument i, a co z argumentem j? |
|
Wrzud |
» 2014-05-12 14:45:53 Wpakuj macierz w wektor std::vector < std::vector < int > > macierz; i daj by operator zwracał referencje do wektora. |
|
DejaVu |
» 2014-05-12 14:47:42 @Lora: Sprawdź, a potem zadawaj kolejne pytania :)
@Wrzud: std::vector nie zawsze jest oczekiwanym rozwiązaniem, więc skupmy się na rozwiązaniu problemu postawionego w temacie, a nie na szukaniu obejścia pasującego do opisywanego problemu :) |
|
Lora Temat założony przez niniejszego użytkownika |
» 2014-05-12 14:54:20 Sprawdziłem i wyskakuje mi błąd: error: invalid initialization of reference of type 'const Wektor&' from expression of type 'Wektor*'| to samo w tym drugim. |
|
DejaVu |
» 2014-05-12 14:58:40 Ekhm... no fakt, ale dlaczego masz Wektor ** m; ? Nie powinno być czasem Wektor * m; ?
/edit:
Doczytałem Twoje intencje. Chcesz mieć 3-wymiarową macierz. Każdy wymiar powinien mieć własny typ obiektu z przeciążonym operatorem []. Najprościej można to zrobić tak:
std::vector < std::vector < Wektor > > m;
i wówczas zwracać:
std::vector < Wektor >& Macierz::operator []( int i ) { return m[ i ]; }
|
|
Lora Temat założony przez niniejszego użytkownika |
» 2014-05-12 15:04:25 Ponieważ tworzę tablicę dwuwymiarową tych wektorów. Gdybym dał Wektor *m to stworzyłbym jednowymiarową tablicę wektorów, prawda? To jest konstruktor mojej macierzy (może to coś pomoże): Macierz::Macierz( int w, int k, int rozm ) : Wektor( rozm ) { int i, j; wier = w; kol = k; Wektor wektor1( rozm ); m = new Wektor *[ wier ]; for( i = 0; i < wier; i++ ) m[ i ] = new Wektor[ kol ]; for( i = 0; i < wier; i++ ) { for( j = 0; j < kol; j++ ) { m[ i ][ j ] = wektor1; } } }
|
|
« 1 » 2 |