Domanda

Io uso dell'operatore () come operatore pedice in questo modo:

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

Funziona quando ricevo i valori, ma ottengo un errore quando provo a scrivere assegnare un valore utilizzando

a(i) = 1;

UPD: Testo errore:

  

L'eccezione non gestita in 0x651cf54a   (Msvcr100d.dll) in CG.exe: 0xC0000005:   Accesso posizione lettura violazione   0xccccccc0.

È stato utile?

Soluzione

Come ho detto nel mio commento, il problema è il vostro disegno difettoso. Faccio una garanzia al 100% su una delle due cose:

  1. Il valore si sta passando alla funzione di assegnazione è fuori intervallo valido.
  2. Il data membro è rivolto allo spazio non valida nella memoria.

In ogni caso, vorrei suggerire di aggiungere:

#include <cassert>

e aggiungendo assert(i >= 0 && i < this->size) invece di fallimenti silenti:

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

Altri suggerimenti

Ecco perché non avete implementato la gestione degli errori in double& CVector::operator() (int i) come avete fatto per l'altra funzione che sovraccarica ().

modificarla in:

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

Si dovrebbe anche pensare di cambiare il meccanismo di gestione degli errori in altra funzione da return 0; a qualcosa di più significativo.

  

L'eccezione non gestita in 0x651cf54a   (Msvcr100d.dll) in CG.exe: 0xC0000005:   Accesso posizione lettura violazione   0xccccccc0.

0xcc è il valore di byte di memoria non inizializzata MSVC. In altre parole, il problema è molto probabilmente dovuto ad accedere un puntatore non inizializzato o un puntatore che è stato derivato dalla memoria non inizializzata.

Il problema è che non si controlla per l'indice out-of-range nella versione double& di operator().

Probabilmente non può garantire che i punti data[i] ad un indirizzo di memoria valido per una grande i abbastanza. Si dovrebbe fare check per l'indice out-of-range e gettare un po 'eccezione o ridimensionare la vettore (assegnando più memoria fare data) per essere in grado di tenere più valori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top