Operator () als Index (C ++)
-
23-09-2019 - |
Frage
Ich benutze Operator () als Index-Operator auf diese Weise:
double CVector::operator() (int i) const
{
if (i >= 0 && i < this->size)
return this->data[i];
else
return 0;
}
double& CVector::operator() (int i)
{
return (this->data[i]);
}
Es funktioniert, wenn ich Werte, aber ich erhalte eine Fehlermeldung, wenn ich versuche, einen Wert zu schreiben assign mit
a(i) = 1;
UPD: Fehlertext:
Nicht behandelte Ausnahme bei 0x651cf54a (Msvcr100d.dll) in CG.exe: 0XC0000005: Zugriffsverletzung Leseort 0xccccccc0.
Lösung
Wie ich in meinem Kommentar, das Problem Ihr fehlerhaft Design. Ich mache eine 100% ige Garantie auf einem von zwei Dingen:
- Der Wert, den Sie auf die Zuordnungsfunktion sind vorbei ist außerhalb des gültigen Bereichs.
- Das Mitglied
data
zeigt auf ungültigen Platz im Speicher.
In jedem Fall würde ich vorschlagen, fügte hinzu:
#include <cassert>
und das Hinzufügen von assert(i >= 0 && i < this->size)
statt der stillen Ausfälle:
double CVector::operator() (int i) const
{
assert(i >= 0 && i < this->size);
return this->data[i];
}
double& CVector::operator() (int i)
{
assert(i >= 0 && i < this->size);
return (this->data[i]);
}
Andere Tipps
Das ist, weil Sie die Fehlerbehandlung in double& CVector::operator() (int i)
nicht umgesetzt haben, wie Sie für die andere Funktion, die Überlastungen ()
hat.
Ändern Sie es an:
double& CVector::operator() (int i)
{
if (i >= 0 && i < this->size)
{
return this->data[i];
}
else // Whatever manner you want to gracefully exit the program
{
std::cout<<"Out of bounds!"<<endl;
exit(1);
}
}
Sie sollten auch den Fehler Wechsel in der anderen Funktion von return 0;
etwas sinnvollen Umgang mit Mechanismus.
Nicht behandelte Ausnahme bei 0x651cf54a (Msvcr100d.dll) in CG.exe: 0XC0000005: Zugriffsverletzung Leseort 0xccccccc0.
0xcc
ist die MSVC nicht initialisierten Speicher-Byte-Wert. Mit anderen Worten, ist Ihr Problem höchstwahrscheinlich auf einen nicht initialisierten Zeiger oder einen Zeiger auf den Zugriff auf die von nicht initialisierten Speicher abgeleitet wurde.
Das Problem ist, dass Sie nicht für Out-of-Range-Index von double&
in Ihrer operator()
Version prüfen.
Sie können sich wahrscheinlich nicht garantieren, dass data[i]
auf eine gültige Speicheradresse für eine ausreichend große i
. Sie sollten entweder prüfen für Out-of-Range-Index und eine Ausnahme auslösen oder Ihren Vektor der Größe (um mehr Speicher zu tun data
Zuteilung) in der Lage sein, mehr Werte zu halten.