C
DragonRaider schrieb:
Edit: Ich verstehe den Sinn der const Überladung des Operators[] noch nicht so ganz, da dieser ja auch zur Bearbeitung der Matrix benutzt werden soll. Aber jetzt wo ich so drüber nachdenke... Bewirkt das dann einfach, dass ich den Wert des Pointers nicht ändern kann (ziemlich dumme Frage, aber da bin ich mir gerade wirklich nicht sicher)
Gegenwärtig kann ich schreiben
const Matrix x(1,1);
x[0][0] = 42;
Wenn aber x konstant ist, ist es doch unlogisch, wenn ich trotzdem den Inhalt verändern kann.
Also muss die Überladung des []-Operators unterscheiden, ob sie für ein konstantes Objekt aufgerufen wird oder nicht. Analog dann für den ()-Operator.
Nebenbei bemerkt, ist es in der Regel nicht sinnvoll, arithmetische Typen wie int per Referenz zu übergeben.
Ein assert ist bei Bereichsüberschreitungen in der Regel viel nützlicher als eine Exception.
const double* Matrix::operator[](unsigned i) const // für konstante Matizen
{
assert(i < _m && "invalid index");
return _data + i * _n;
}
double* Matrix::operator[](unsigned i) // für modifizierbare Matrizen
{
return const_cast<double*>( (*const_cast<const Matrix*>(this))[i] ); // vermeidet Codeduplikation
}
const double& Matrix::operator()(unsigned i, unsigned j) const
{
assert(j < _n && "invalid index");
return (*this)[i][j];
}
double* Matrix::operator[](unsigned i)
{
return const_cast<double*>( (*const_cast<const Matrix*>(this))(i,j) );
}