Operatore () come pedice (C ++)
-
23-09-2019 - |
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.
Soluzione
Come ho detto nel mio commento, il problema è il vostro disegno difettoso. Faccio una garanzia al 100% su una delle due cose:
- Il valore si sta passando alla funzione di assegnazione è fuori intervallo valido.
- 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.