2013-03-24 12 views
5

Ich habe eine Matrix-Klasse, die [] [] verwendet, um auf Elemente zuzugreifen. Wenn ein (oder beide) Indizes außerhalb der Grenzen liegen, muss ich CIndexException auslösen. Es ist eine Klasse, die Text in diesem Format "Ungültiger Index [a] [b]" speichert, wobei a und b Zahlen sind.Ausnahmebedingung, wenn Array außerhalb der Grenzen ist

Dies ist meine aktuelle Implementierung von CIndexException Klasse

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 als 2D-Array von Doppel dargestellt wird, ist es im Konstruktor initialisiert wird:

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

einzelnes Element zu erhalten, ich überlastete [ ] Operator wie folgt aus:

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

Wenn ich einen [2] [3], um diese Funktion re löst das erste [], gibt Zeiger auf ein Array zurück und das zweite [] wird wie üblich aufgelöst.

Ich kann leicht überprüfen, ob der erste Index außerhalb der Grenzen ist, aber ich habe Probleme beim Überprüfen der zweiten. Ich dachte daran, eine zweite Klasse, MatrixRow, zu erstellen, die eine Matrixzeile darstellt. Dann hätte ich MatrixRows. Um [] [] zum Laufen zu bringen, hätten beide Klassen den Operator [] überladen. Auf diese Weise wäre ich in der Lage, beide Indizes zu überprüfen, aber ich habe keine Ahnung, wie ich sie zu einer Ausnahme "verbinden" kann. Wie kann ich bei Verwendung dieses Designs beide Indizes im Ausnahmeobjekt melden?

+1

Sie haben Ihre Frage bereits beantwortet, Sie müssen eine 'MatrixRow'-Klasse erstellen, den Operator' [] 'überladen, und Sie sind fertig. Was ist das Problem? – antonijn

+4

Ich sehe keine Fragezeichen. – mfontanini

+0

@antonijn - das Problem ist, dass die 'MatrixRow' Klasse beide in der Ausnahme verwendeten Indizes melden muss, aber normalerweise würde sie nur die Spalte kennen. –

Antwort

3

Gehen Sie mit Ihrer MatrixRow Lösung, aber übergeben Sie den Index der Zeile an jedes MatrixRow als Konstruktor Argument. Die MatrixRow kann diese Nummer speichern und in allen von ihr generierten Ausnahmemeldungen verwenden.

1

Verwenden Sie operator()() anstelle von operator[](). Siehe hierzu link. Alles, was Sie benötigen, berücksichtigt diesen Link.

+0

Das ist nur hässlich. Diese Matrizen verwenden eine spezielle Nicht-C++ - Syntax für die Indizierung. –

+0

'm [i] [j]' sagt: "Hallo' m (i, j) '. Du bist so hässlich, aber du arbeitest so gut und dein Design ist viel einfacher. Warum?" – Narek

+0

Die gleiche Anwendung wird wahrscheinlich auch 1D-Arrays (Vektoren) verwenden. Werden sie auch den Operator() überladen? Jetzt unterscheiden sie sich von nativen Arrays und std :: vector; Verwirrung entsteht. –

Verwandte Themen