Вопрос

Я использую оператор() в качестве оператора индекса следующим образом:

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

Это работает, когда я получаю значения, но получаю ошибку, когда пытаюсь записать присвоение значения, используя

a(i) = 1;

УПД:Текст ошибки:

Незаверное исключение в 0x651CF54A (MSVCR100D.DLL) в CG.Exe:0xC0000005:Расположение чтения доступа к нарушению 0xcccccc0.

Это было полезно?

Решение

Как я уже сказал в своем комментарии, проблема в вашем ошибочном дизайне.Я даю 100% гарантию на одно из двух:

  1. Значение, которое вы передаете функции присваивания, находится за пределами допустимого диапазона.
  2. Член data указывает на недопустимое место в памяти.

В любом случае я бы предложил добавить:

#include <cassert>

и добавление assert(i >= 0 && i < this->size) вместо молчаливых неудач:

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

Другие советы

Это потому, что вы не реализовали обработку ошибок в double& CVector::operator() (int i) как вы это сделали для другой функции, которая перегружает ().

Измените его на:

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

Вам также следует рассмотреть возможность изменения механизма обработки ошибок в другой функции с return 0; к чему-то более значимому.

Незаверное исключение в 0x651CF54A (MSVCR100D.DLL) в CG.Exe:0xC0000005:Расположение чтения доступа к нарушению 0xcccccc0.

0xcc — значение байта неинициализированной памяти MSVC.Другими словами, ваша проблема, скорее всего, связана с доступом к неинициализированному указателю или указателю, полученному из неинициализированной памяти.

Проблема в том, что вы не проверяете индекс выхода за пределы диапазона в своем double& версия operator().

Вы, вероятно, не можете этого гарантировать data[i] указывает на действительный адрес памяти для достаточно большого i.Вам следует либо проверить индекс, выходящий за пределы диапазона, и выдать какое-либо исключение, либо изменить размер вектора (выделив больше памяти). data), чтобы иметь возможность хранить больше значений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top