Mam klasę macierzy, która używa [] [] do dostępu do elementów. Kiedy jeden (lub oba) indeksy są poza zasięgiem, muszę rzucić wyjątek CIndexException. Jest to klasa przechowująca tekst w tym formacie "Nieprawidłowy indeks [a] [b]", gdzie aib oznaczają liczby.Wyjątek wyrzucania, gdy tablica jest poza zakresem
To moja obecna implementacja klasy CIndexException
class CIndexException
{
string text;
public:
CIndexException (int a, int b)
{
ostringstream oss;
oss << "Invalid index [";
oss << a;
oss << "][";
oss << b;
oss < "]";
text = oss.str();
}
string get() const
{
return text;
}
};
Matrix jest reprezentowany jako tablica 2D deblu, jest on zainicjowany w konstruktorze:
CMatrix(int r, int c)
{
colls = c;
rows = r;
mat = new double * [rows];
for (int i = 0; i < rows; i++)
{
mat[i] = new double [colls];
for (int j = 0; j < colls; j++)
mat[i][j] = 0;
}
}
aby uzyskać pojedynczy element, ja przeciążony [ ] operator podobny do poniższego:
double * operator[] (int x) const
{
return mat[x];
}
Po wpisaniu [2] [3] ta funkcja ponownie rozwiązuje pierwszy [], zwraca wskaźnik do tablicy, a drugi [] zostaje rozwiązany jak zwykle.
Mogę łatwo sprawdzić, czy pierwszy indeks jest poza zakresem, ale mam problem ze sprawdzeniem drugiego. Pomyślałem o stworzeniu drugiej klasy, MatrixRow, która reprezentuje jeden rząd macierzy. Wtedy będę miał tablicę MatrixRows. Aby działać [] [], obydwie te klasy przeciążałyby operatora []. W ten sposób będę mógł sprawdzić oba indeksy, ale nie mam pojęcia, jak "połączyć" je w jeden wyjątek. Jak mogę zgłosić oba indeksy w obiekcie wyjątku podczas korzystania z tego projektu?
Już odpowiedziałeś na swoje pytanie, musisz utworzyć klasę 'MatrixRow', przeciążyć operatora' [] ', i gotowe. Jaki jest problem? – antonijn
Nie widzę żadnych znaków zapytania. – mfontanini
@antonijn - problemem jest to, że klasa 'MatrixRow' musi raportować oba indeksy używane w wyjątku, ale normalnie znałaby tylko kolumnę. –