Przeciążenie operatora [][]

0

Cześć, jak przeciążyć operator [][]?
Czyli zamiast: obj.macierz[ 1 ][ 1 ] = 999;
żeby było coś takiego: obj[ 1 ][ 1 ] = 999;

GPT podał mi coś takiego:

int* operator[](int k)
{
    return macierz[k];
}

ale nie wiem czy to o to chodzi, bo kompletnie nie rozumiem tego zapisu. dlaczego przeciazajac () jest &, a nie *?

int& operator()(int k, int n)
{
    return macierz[k][n];
}
6

Cześć, jak przeciążyć operator [][]?
Czyli zamiast: obj.macierz[ 1 ][ 1 ] = 999;
żeby było coś takiego: obj[ 1 ][ 1 ] = 999;

obj[ 1 ] musiałoby zwrócić coś (obiekt klasy, tablica, wskaźnik…), co też ma przeciążony operator[] i jednocześnie dostęp do obj.macierz.

1
maksym572285 napisał(a):

GPT podał mi coś takiego:

int* operator[](int k)
{
    return macierz[k];
}

No i dobrze napisał bo zwraca wartość typu int* więc jeśli użyje się na tej wartości kolejnego operatora [] to jest to poprawne wyrażenie indeksujące tablicę (wskaźnik).
Trzeba było zayptać czemu ma to taką formę jeśli już tego nie zrobił. GPT wyjaśnie wszystko z bolesną ilością szczegółów.

0
maksym572285 napisał(a):

ale nie wiem czy to o to chodzi, bo kompletnie nie rozumiem tego zapisu. dlaczego przeciazajac () jest &, a nie *?

tam nie może być * bo zwracasz pojedynczy element z macierzy return macierz[k][n] typu int. Można ją zwrócić jako wartość int albo referencję int&, dzięki temu da się zrobić alias do konkretnego elementu macierzy (czy to będzie w ogóle przydatne?):

#include <iostream>

using namespace std;

struct M {
    int* operator[](int i) {
        return macierz[i];
    }

    int& operator()(int i, int j) {
        return macierz[i][j];
    }

    int macierz[3][3];
};

int main() {
    M m{11, 12, 13, 21, 22, 23, 31, 32, 33};

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << m[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << m(i, j) << " ";
        }
        cout << endl;
    }
    cout << endl;

    int& a = m(1,1); // referencja do elementu w macierzy; 
    cout << "address(a) = " << &a << endl;
    a = 1111;
    cout << "m.macierz[1][1] = " << m.macierz[1][1] << endl; // powinno zawierać 1111
    cout << "address(m.macierz[1][1]) = " << &m.macierz[1][1] << endl; // adres taki sam jak "a"

    return 0;
}
1

@jvoytech: czy to będzie w ogóle przydatne:
No, czemu nie:
m(1,4) = 15;

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