Оператор() как индекс (C++)
-
23-09-2019 - |
Вопрос
Я использую оператор() в качестве оператора индекса следующим образом:
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% гарантию на одно из двух:
- Значение, которое вы передаете функции присваивания, находится за пределами допустимого диапазона.
- Член
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
), чтобы иметь возможность хранить больше значений.