Problem w projekcie z Tablicami 2d / Arrays 2D

0

Witam, jest to moj 1szy post, wiec prosze o wyrozumialosc. Mam problem z rozwiazaniem pewnego projektu ktorego tresc jest nastepujac.

Napisz szablon klasy Arr2D reprezentuj¡cej macierze (prostokątne tablice dwuwymiarowe) elementów pewnego typu typ ten jest jedynym parametrem szablonu. Klasa wyposażona jest w:
• konstruktor, pobieraj¡cy wymiary macierzy - liczbę jej wierszy i kolumn;
• przeciążenia operatora indeksowania operator tak, aby dla macierzy m wyrażenie m[i][j] było elementem tablicy o indeksie wiersza i oraz kolumny j - powinien być moćliwy zarówno odczyt jak i zapis takiego elementu (oczywiście wiersze i kolumny indeksowane są od 0);
• metody rows() i cols() zwracające, odpowiednio, liczbę wierszy i kolumn macierzy;
• metodę rowView(size_t) zwracającą obiekt typu RowView reprezentuj¡cy wiersz o podanym indeksie (patrz niżej);
• metodę colView(size_t) zwracającą obiekt typu ColView reprezentujący kolumnę o podanym indeksie (patrz niżej);
• metodę matView(size_t, size_t, size_t, size_t) zwracajęcą obiekt typu MatView reprezentujący prostokątną podmacierz danej macierzy (patrz niżej);
• destruktor;
• przeciążenie operatora operator<<, pozwalajace na wstawianie macierzy do strumieni wyjsciowych.

Klasa RowView (ColView), zdefniowana oczywiscie tez za pomoca szablonu, reprezentuje widok pojedynczego wiersza (kolumny) macierzy. Dla klasy defniujemy
• prywatny konstruktor pobierajacy indeks żadanego wiersza (kolumny);
• metode size() zwracajaca wymiar wiersza (kolumny); •
przecizenia operatora indeksowania operator tak, aby dla obiektu row (col) wyrazenie row[i] (col[i]) bylo elementem reprezentowanego przez ten obiekt wiersza (kolumny) o indeksie i. Mozliwy powinien byc zarówno odczyt jak i modyfkacja takiego elementu;
• przeciazenie operatora operator<<, pozwalajace na wstawianie obiektu do strumieni wyjsciowych.
Konstruktor jest prywatny, aby uzytkownik nie mógl sam tworzyc takich obiektów: beda one tworzone w zaprzyjaznionej klasie Arr2D w metodach rowView i colView. Obiekt jest widokiem (ang. view) wiersza lub kolumny, czyli nie tworzy zadnych kopii: wszelkie odwolania (odczyt i zapis) do elementów reprezentowanego przez ten obiekt wiersza (kolumny) sa odwolaniami do odpowiednich elementów wyjsciowej macierzy!
Klasa MatView reprezentuje widok podmacierzy pewnej macierzy; defniujemy dla niej
• prywatny konstruktor pobierajacy wskaznik do macierzy (obiektu Arr2D), której podmacierz chcemy otrzymac oraz cztery liczby: indeks wiersza macierzy, który ma byc pierwszym wierszem podmacierzy, liczbe wierszy w tworzonej podmacierzy i podobne dwie liczby dla kolumn;
• metody rows() i cols() zwracajace, odpowiednio, liczbe wierszy i kolumn podmacierzy reprezentowanej obiektem;
• przeciazenia operatora indeksowania operator tak, aby dla podmacierzy m wyrazenie m[i][j] bylo elementem o indeksie wiersza i oraz kolumny j - powinien byc mozliwy zarówno odczyt jak i zapis takiego elementu; wiersze i kolumny indeksowane sa od 0 w ramach danej podmacierzy;
• przeciazenie operatora operator<<, pozwalajace na wstawianie obiektów do strumieni wyjsciowych.
Konstruktor jest znów prywatny i obiekty tej klasy beda tworzone tylko w zaprzyjaznionej klasie Arr2D w metodzie matView wywolanej na rzecz macierzy której podmacierz chcemy otrzymac. Obiekt jest widokiem, wiec nie sa tworzone zadne kopie.

int main()

{

    using std::cout;
    Arr2D<int> a(3, 4);
    a[0][0] = 1;
    a[0][1] = 2;
    a[0][2] = 1;
    a[0][3] = 2;
    a[1][0] = 2;
    a[1][1] = 3;
    a[1][2] = 2;
    a[1][3] = 3;
    a[2][0] = 4;
    a[2][1] = 5;
    a[2][2] = 4;
    a[2][3] = 5;
    cout << "Matrix 'a': " << a.rows() << " rows, " << a.cols() << " columns\n" << a;

    auto r2 = a.rowView(2);
    cout << "Row with index 2\n" << r2 << '\n';
    r2[0] = 8; // modifying row
    cout << "Matrix 'a' after modification of the row\n";
    cout << a;

    auto c3 = a.colView(3);
    cout << "Column with index 3\n" << c3 << '\n';
    c3[0] = 9; // modifying column
    cout << "Matrix 'a' after modification of the column\n";
    cout << a;
submatrix:
    XOOX size_t startRow{ 0 }, numRow{ 2 }, // XOOX
        startCol{ 1 }, numCol{ 2 }; // XXXX
    auto m = a.matView(startRow, numRow, startCol, numCol);
    cout << "Submatrix\n" << m;
    for (size_t r = 0; r < numRow; ++r)
        for (size_t c = 0; c < numCol; ++c)
            m[r][c] = 7; // mofifying submatrix
    cout << "Matrix 'a' after the modification\n";
    cout << a;
}

generalnie program ten powinien dac taki wydruk:

Matrix 'a': 3 rows, 4 columns
1 2 1 2
2 3 2 3
4 5 4 5
Row with index 2
[ 4 5 4 5 ]
Matrix 'a' after modification of the row
1 2 1 2
2 3 2 3
8 5 4 5
Column with index 3
[ 2 3 5 ]
Matrix 'a' after modification of the column
1 2 1 9
2 3 2 3
8 5 4 5
Submatrix
2 1
3 2
Matrix 'a' after the modification
1 7 7 9
2 7 7 3
8 5 4 5

Ja do tej pory stworzylem cos takiego :

#include <iostream>


using namespace std;
template <class T>
class Arr2D;


template <class T>
class RowView
{

    int index;

    RowView(T index)
    {
        Arr2D<T>::row = index;
        for (int i = 0; i < Arr2D<T>::rows(); i++)
            cout << "????";
    }

public:
    int size()
    {
        return Arr2D<T>::a.rows();
    }
};

template <class T>
class ColView
{

    Arr2D<T> a;

    ColView(Arr2D<T>* a)
    {
        this->a = a;
    }

public:
    int size()
    {
        return a.cols();
    }
};

template <class T>
class MatView
{

    Arr2D<T> a;

    MatView(Arr2D<T>* a)
    {
        this->a = a;
    }

public:
};


template <class T>
class Arr2D
{
    int row;
    ;
    int col;
    T** arr;

public:
    Arr2D();
    Arr2D(T row, T col)
        : row(row)
        , col(col)
    {
        T val;
        arr = new T*[row];
        for (int i = 0; i < row; i++)
            arr[i] = new T[col];
    }
    Arr2D(Arr2D const& a);


    ~Arr2D()
    {
        delete[] arr;
    }


    T* operator[](size_t el)
    {
        return arr[el];
    }

    int rows()
    {
        return row;
    }
    int cols()
    {
        return col;
    }

    RowView<T> rowView(size_t s)
    {


        return new RowView<T>(s);
    }
    ColView<T> colView(size_t s)
    {


        return new ColView<T>(s);
    }

    MatView<T> matView()
    {
        return new MatView<T>();
    }


    friend ostream& operator<<(ostream&, const Arr2D<T>&);

    friend class RowView<T>;
    friend class ColView<T>;
    friend class MatView<T>;
};


template <class T>
ostream& operator<<(ostream& str, Arr2D<T>& a)
{

    for (int i = 0; i < a.rows(); i++)
    {
        for (int j = 0; j < a.cols(); j++)
        {
            str << a[i][j] << " ";
        }
        str << endl;
    }
    return str;
}


int main()

{

    using std::cout;
    Arr2D<int> a(3, 4);
    a[0][0] = 1;
    a[0][1] = 2;
    a[0][2] = 1;
    a[0][3] = 2;
    a[1][0] = 2;
    a[1][1] = 3;
    a[1][2] = 2;
    a[1][3] = 3;
    a[2][0] = 4;
    a[2][1] = 5;
    a[2][2] = 4;
    a[2][3] = 5;
    cout << "Matrix 'a': " << a.rows() << " rows, " << a.cols() << " columns\n" << a;

    auto r2 = a.rowView(2);
    cout << "Row with index 2\n" << r2 << '\n';
    r2[0] = 8; // modifying row
    cout << "Matrix 'a' after modification of the row\n";
    cout << a;

    auto c3 = a.colView(3);
    cout << "Column with index 3\n" << c3 << '\n';
    c3[0] = 9; // modifying column
    cout << "Matrix 'a' after modification of the column\n";
    cout << a;
submatrix:
    XOOX size_t startRow{ 0 }, numRow{ 2 }, // XOOX
        startCol{ 1 }, numCol{ 2 }; // XXXX
    auto m = a.matView(startRow, numRow, startCol, numCol);
    cout << "Submatrix\n" << m;
    for (size_t r = 0; r < numRow; ++r)
        for (size_t c = 0; c < numCol; ++c)
            m[r][c] = 7; // mofifying submatrix
    cout << "Matrix 'a' after the modification\n";
    cout << a;
}

i utknalem na klasach zaprzyjazninych RowView , ColView , MatView. moja klasa Arr2d wydaje sie ze dziala prawidlowo.
Wiem ze post i zadanie dosc dlugie tymbardziej bede wdzieczny tym ktorzy podejma sie przeczytanai i udzielenia pomocy :) Bedee wdzieczny za wszelkie sugestie i podpowiedzi ewentualnie jakies linki ktore moga mi pomoc w rozwiazaniu tego zadania .

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