Tak jeszcze wrócę do poprzedniego rozwiazania bo jest jednak dość proste i warto żebyś zrozumiał.
Kod: Zaznacz cały
class Macierz{
public:
float ** macierz;
... pozostałe parametry
Macierz(int rozmiar=1)
{
macierz=new float*[rozmiar];
for(int i=0;i<rozmiar;i++)
macierz[i]=new float[rozmiar];
}
};
I teraz wytłumaczę kolejne fragmenty:
To jest wskaźnik na wskaźnik na float czyli de facto tablica wskaźników(taka niezaalokowana, sam adres). Masz więc najpierw zaalokowac jej miejsce żeby kompilator wiedział ile chcesz mieć tych wskaźników. mamy więc:
Czyli alokujemy tyle wskaźników jaką ma wartość zmienna rozmiar. Teraz mamy juz naszą tablicę o ustalonej liczbie wskaźników. Każda komórka tablicy macierz macierz[0],macierz[1],...,macierz[rozmiar] ma wartosć, która nie jest zwykłą wartoscia tylko wskaźnikiem. Teraz zostaje już zwykła alokacja tylu tablic jednowymiarowych jaka wartość ma zmienna rozmiar:
Zwykła alokacja pamięci na dynamiczna tablicę jednowymiarową wygląda tak:
My chcemy jednak miec rozmiar-razy takich tablic aby uzyskać macierz, robimy więc w pętli:
Kod: Zaznacz cały
for(int i=0;i<rozmiar;i++)
macierz[i]=new float[rozmiar];
Oczywiście jest to jeden ze sposobów dynamicznej alokacji pamięci, ale sądzę, że warto go znać i rozumieć.
Teraz możemy skorzystać juz z naszego konstruktora i utworzyć w main obiekt klasy Macierz.
i odwołujemy sie do naszych komórek:
Myślę, że teraz powinno być już jasne.