Operador () como un subíndice (C ++)
-
23-09-2019 - |
Pregunta
utilizo operador () como un operador de subíndice de esta manera:
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]);
}
Funciona cuando llegue a los valores, pero me da un error cuando trato de escribir asignar un valor utilizando
a(i) = 1;
UPD: Texto de error:
excepción no controlada en 0x651cf54a (Msvcr100d.dll) en CG.exe: 0xC0000005: ubicación lectura violación de acceso 0xccccccc0.
Solución
Como dije en mi comentario, el problema es que su diseño defectuoso. Hago una garantía del 100% en una de dos cosas:
- El valor que está de paso a la función de asignación está fuera del rango válido.
- El
data
miembro se señala al espacio en la memoria no válida.
En cualquier caso, yo sugeriría añadiendo:
#include <cassert>
y añadiendo assert(i >= 0 && i < this->size)
en lugar de los fallos silenciosos:
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]);
}
Otros consejos
Esto se debe a que no ha implementado el control de errores en double& CVector::operator() (int i)
igual que lo hizo para la otra función que ()
sobrecargas.
Cambiar a:
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);
}
}
También se debe considerar el cambio del sistema de tramitación en la otra función de return 0;
a algo más significativo de error.
excepción no controlada en 0x651cf54a (Msvcr100d.dll) en CG.exe: 0xC0000005: ubicación lectura violación de acceso 0xccccccc0.
0xcc
es el valor del byte de memoria sin inicializar MSVC. En otras palabras, el problema es más probable debido al acceder a un puntero no inicializado o un puntero que se derivó de la memoria sin inicializar.
El problema es que no la marca de índice fuera de rango en su versión double&
de operator()
.
Es probable que no puede garantizar que los puntos de data[i]
a una dirección de memoria válida para un gran i
suficiente. Usted debe comprobar ya sea para el índice fuera de rango y arrojar alguna excepción o cambiar el tamaño de su vector (mediante la asignación de más memoria do data
) para ser capaz de mantener más valores.