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.

¿Fue útil?

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:

  1. El valor que está de paso a la función de asignación está fuera del rango válido.
  2. 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top