2013-03-24 15 views
5

Ho una classe matrice, che utilizza [] [] per accedere agli elementi. Quando uno (o entrambi) indici sono fuori limite, devo lanciare CIndexException. È una classe che memorizza il testo in questo formato "Invalid index [a] [b]", dove aeb sono numeri.Eccezione di lancio quando la matrice è fuori limite

Questo è il mio attuale implementazione della classe 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 è rappresentato come una matrice 2D di doppi, viene inizializzato nel costruttore:

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; 
    } 
} 

Per ottenere singolo elemento, ho sovraccaricato [ ] esercente simili:

double * operator[] (int x) const 
{ 
    return mat[x]; 
} 

Quando si digita una [2] [3], questa funzione re risolve il primo [], restituisce il puntatore a un array e il secondo [] viene risolto come al solito.

Posso facilmente controllare se il primo indice è fuori dai limiti, ma ho problemi a controllare il secondo. Ho pensato di creare una seconda classe, MatrixRow, che rappresenta una riga di matrice. Quindi avrei array di MatrixRows. Per ottenere [] [] lavorando, entrambe le classi avrebbero un operatore sovraccarico []. In questo modo sarei in grado di controllare entrambi gli indici, ma non ho idea di come "unirli" in un'unica eccezione. Come posso segnalare entrambi gli indici nell'oggetto eccezione mentre si utilizza questo disegno?

+1

Hai già risposto alla tua domanda, devi creare una classe 'MatrixRow', sovraccaricare l'operatore' [] 'e hai finito. Qual è il problema? – antonijn

+4

Non vedo punti interrogativi. – mfontanini

+0

@antonijn - il problema è che la classe 'MatrixRow' deve riportare entrambi gli indici usati nell'eccezione, ma normalmente conoscerebbe solo la colonna. –

risposta

3

Vai con la tua soluzione MatrixRow, ma passa l'indice della riga a ogni MatrixRow come argomento del costruttore. Lo MatrixRow può salvare quel numero e usarlo in tutti i messaggi di eccezione che genera.

1

Utilizzare operator()() anziché operator[](). Vedi questo link. Tutto quello che ti serve questo link considera.

+0

Questo è solo brutto. Queste matrici utilizzano una sintassi speciale non C++ per l'indicizzazione. –

+0

'm [i] [j]' dice: "Ciao' m (i, j) '. Sei così brutto, ma lavori così bene e il tuo design è molto più semplice. – Narek

+0

La stessa applicazione utilizzerà probabilmente anche array 1D (vettori). Sovraccaricheranno anche l'operatore()? Ora sono diversi dagli array nativi e std :: vector; ne deriva confusione. –

Problemi correlati