2013-03-24 19 views
5

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?

+1

Już odpowiedziałeś na swoje pytanie, musisz utworzyć klasę 'MatrixRow', przeciążyć operatora' [] ', i gotowe. Jaki jest problem? – antonijn

+4

Nie widzę żadnych znaków zapytania. – mfontanini

+0

@antonijn - problemem jest to, że klasa 'MatrixRow' musi raportować oba indeksy używane w wyjątku, ale normalnie znałaby tylko kolumnę. –

Odpowiedz

3

Przejdź do rozwiązania MatrixRow, ale przekazuj indeks wiersza do każdego MatrixRow jako argument konstruktora. Model MatrixRow może zapisać tę liczbę i używać jej w każdym wygenerowanym komunikacie o wyjątku.

1

Użyj operator()() zamiast operator[](). Zobacz ten link. Wszystko, czego potrzebujesz, ten link bierze pod uwagę.

+0

To po prostu brzydkie. Te macierze używają do indeksowania specjalnej składni innej niż C++. –

+0

'm [i] [j]' mówi: "Hello' m (i, j) '. Jesteś taki brzydki, ale pracujesz tak dobrze i twój projekt jest znacznie prostszy. – Narek

+0

Ta sama aplikacja prawdopodobnie będzie również używać tablic 1D (wektorów). Czy też przeciążą operatora()? Teraz różnią się od rodzimych tablic i std :: vector; dezorientacja. –

Powiązane problemy