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.

War es hilfreich?

Lösung

Wie ich in meinem Kommentar, das Problem Ihr fehlerhaft Design. Ich mache eine 100% ige Garantie auf einem von zwei Dingen:

  1. Der Wert, den Sie auf die Zuordnungsfunktion sind vorbei ist außerhalb des gültigen Bereichs.
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top