Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Przeciążanie operatora [] - tablica wielowymiarowa

Ostatnio zmodyfikowano 2014-05-12 17:39
Autor Wiadomość
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:
 
C/C++
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:

C/C++
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.
P-109779
DejaVu
» 2014-05-12 14:30:49
Musisz zwrócić obiekt, który zawiera również przeciążony operator [].

C/C++
const Wektor & Macierz::operator []( int i ) const
{
    return m[ i ];
}

Wektor & Macierz::operator []( int i )
{
    return m[ i ];
}
P-109780
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?
P-109783
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.
P-109784
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 :)
P-109785
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.
P-109786
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:
C/C++
std::vector < std::vector < Wektor > > m;
i wówczas zwracać:
C/C++
std::vector < Wektor >& Macierz::operator []( int i )
{
    return m[ i ];
}
P-109788
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):
C/C++
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;
           
        }
    }
}
P-109791
« 1 » 2
  Strona 1 z 2 Następna strona