2010-03-29 3 views
1

Я использую оператор() в качестве оператора индекса так:Оператор() в качестве индекса (C++)

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; 

UPD: текст ошибки:

необработанное исключение при 0x651cf54a (msvcr100d.dll) в CG.exe: 0xC0000005: Доступ к считыванию нарушений доступа 0xccccccc0.

+2

Какая ошибка у вас? Также: ваше поведение несовместимо. Вы тихо выходите из-за пределов диапазона для считывания и seg-ошибки на значения вне диапазона для записи. –

+0

Если вы пишете класс типа массива, вы, вероятно, решили сделать все управление памятью самостоятельно? Это означает, что вам необходимо определить четыре метода, которые автоматически определит компилятор. Если вы забыли, тогда вы собираетесь создавать недопустимые ячейки памяти. Отправьте конструкторы/деструкторы и оператор присваивания. –

ответ

2

Как я уже сказал в своем комментарии, проблема в том, что ваш недостаток дизайна. Я делаю 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]); 
} 
0

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

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

1

Это потому, что вы не внедрили обработку ошибок в 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; к чему-то более значимое.

1

Необработанное исключение при 0x651cf54a (msvcr100d.dll) в CG.exe: 0xC0000005: Доступ к считыванию нарушений доступа 0xccccccc0.

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

Смежные вопросы