Przeciążanie operatora [] obiekt dynamiczny

0

Witam.
Mam napisaną klasę macierz w której mam przeciążony oprerator indeksowania:

class Macierz
{
    private:
    const int N;
    const int M;
    float **tab;
    public:
    Macierz() : N(4), M(4)
    {
        tworzMacierz();
    }
    Macierz(int x, int y) : N(x), M(y)
    {
        tworzMacierz();
    }
    Macierz(Macierz &ob): N(ob.getN()), M(ob.getM())
    {
        tworzMacierz();
    }
    ~Macierz()
    {
        for(int i=0;i<M;i++)
        {
            delete[] tab[i];
        }
        delete [] tab;
    }
    void tworzMacierz();
    inline const int getN()
    {
        return N;
    }
    inline const int getM()
    {
        return M;
    }
    void wypisz()
    {
        for(int i = 0;i < M ;i++)
        {
            for(int j = 0; j<N;j++)
            cout << this[i][j] << " ";
            cout << endl;
        }
    }
    float * operator[](int x )
    {

        return tab[x];
    } 

Wszystko działa ładnie gdy używam obiektów automatycznych(Lub wyłuskuje obiekt dynamiczy przed indeksowaniem). Ale gdy indeksuje bezpośrednio obiekt dynamiczy program się zawiesza. Czy istnieje sposób żeby przeciążyć operator indeksowania żeby działał na wskaźniku na klasę tak samo jak na klasie automatycznej. Docelowo chodzi o to żeby następujący kod działał bez problemów:

Macierz * mac = new Macierz(5,5);
    mac[2][2]=3;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
            cout << mac[i][j] << " - ";
        cout << endl;
    } 
0
szakal666 napisał(a):

Czy istnieje sposób żeby przeciążyć operator indeksowania żeby działał na wskaźniku na klasę tak samo jak na klasie automatycznej.
Istnieje sposób, ale jeśli to zrobisz to spodziewaj się, że potem ktoś przyjdzie po ciebie by cię zamordować.
nawet nie mam siły tłumaczyć czemu jest to poroniony pomysł, zresztą sam pomyśl, co się stanie w takim wypadku jeśli ktoś będzie chał mieć tablicę macierzy, albo dynamiczną tablicę macierzy.

A swój kod popraw tak (*mac)[i][j] albo tak mac[0][i][j].

0

Oprócz tego co powiedział @MarekR22 możesz jeszcze zrobić tak: Macierz mac(5,5);
lub tak: Macierz &mac=*(new Macierz(5,5)); ... delete &mac;

0

nigdy nie zaakceptował bym diffa z czymś takim "Macierz &mac=*(new Macierz(5,5));" w języku bez GC

0

odpowiedź brzmi: nie alokować takiego obiektu dynamicznie. nie ma po co. zajmuje tyle co jeden wskaźnik i dwa inty.

używać obiektu na stosie albo referencji.

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