2010-12-27 6 views
1

Ich habe eine Aufgabe, eine Klassenmatrix in C++ zu schreiben, und es gibt eine Bedingung, den Operator [] für Matrix zu überschreiben, also wenn ich eine Matrix mit dem Namen Matrix mit dieser "Matrix [0] [0 ] "Ich muss sein erstes Element nehmen, in erster Linie. Ich habe die Matrix mit zweidimensionalen dynamischen Arrays und Templates (T ** Matrix) dargestellt. Kannst du mir bitte helfen?Operator überladen []

PS: Diese Methode, die ich die zweidimensionale Matrix erstellen bin mit:

template <class T> 
T ** Matrix<T>::createMatrix(unsigned int rows, unsigned int cols) 
{ 
    T** matrix = new T*[rows]; 
    for (unsigned int i = 0; i < rows; i++) { 

     matrix[i] = new T[cols]; 

    } 
    return matrix; 
} 
+1

'T **' does ** not ** beschreibt ein zweidimensionales Array. Es beschreibt ein Array von Arrays, das nicht das gleiche ist. –

Antwort

2

ich nehme an, Matrix ist eine Elementvariable vom Typ T ** der Matrix.

template< class T > 
T* operator [](Matrix<T>& m, unsigned int row) 
{ 
    // maybe remember rows and assert(row<rows); 
    return m.matrix[ row ]; 
} 

Jetzt können Sie so etwas wie

Matrix<T> m(50,9999); 
m[42][1337]; 

zuzugreifen Element 1337 in Zeile 42.

+0

Danke! Sehr einfach, clever und elegant!Danke nochmal:). –

1

Sie können diese Klassen mit zwei tun. Die Matrixklasse überschreibt [] und gibt ein Zeilenobjekt zurück. Das Zeilenobjekt überschreibt [] und gibt einen Skalar zurück.

0

Sie können nicht nativ in C++ tun, aber man konnte einfach instanziieren Ihre Matrix auf diese Weise:

Matrix<Matrix<int>> m; 

diese Weise die ersten [] kehrt eine andere Matrix, die das gewünschte Element zurückkehren wird. Natürlich wäre ein viel besserer Name für Ihre Klasse dann Vector und eine Wrapper-Klasse namens Matrix, die eine interne Vector<Vector<T>> erstellt.

1

Sie möchten einen T * in Operator [] zurückgeben, da der Operator [] dann nativ angewendet werden und das gewünschte Ergebnis erhalten kann. Ich möchte jedoch darauf hinweisen, dass es ziemlich schlecht ist, die Zeiger roh zu belassen.

0

Die Methode, die Sie verwenden, schreiben die Matrix zu erstellen nichts mit einem zu tun haben Klasse, wie Ihre Anforderungen angeben. Sie erstellen eine einfache T**, es macht keinen Unterschied, dass Sie es in einer Klassenmethode tun.

eine Matrix von T zu schaffen, wie in matrix[i][j] verwendet werden kann, bedeutet, dass der Ausdruck matrix[i] einen Typen zurückgeben muss, auf dem Bediener auch ein []T zurückzukehren definiert. Daher ist die übliche Art und Weise, es zu tun ist es brechen in den Schritten:

  • Matrix<T> operator[] (int) gibt ein MatrixRow<T>&
  • MatrixRow<T>& operator[] (int) a kehrt T&

Es wird auch const Versionen dieser Operatoren zu nutzen wenn Werte aus der Matrix gelesen werden (nicht-konstante Versionen werden beim Schreiben in die Matrix verwendet).

Also, im Minimum sollten Sie eine Klasse mit dieser Schnittstelle erstellen:

template <typename T> 
class Matrix { 
    public: 
     Matrix(int rows, int cols); 

     const MatrixRow<T>& operator[] (int row) const; 
     MatrixRow<T>& operator[] (int row); 
} 

PS: Das liest sich wie ein Hausaufgaben Frage, ist es eine?

+0

Ja ist es. Ich habe die Determinantenmethode, Multiplikationsmethode und so weiter gemacht ... Jetzt habe ich das endlich gemacht :). –