Оператор () как индекс (C ++) - PullRequest
1 голос
/ 30 марта 2010

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

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.

Ответы [ 4 ]

2 голосов
/ 30 марта 2010

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

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

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

1 голос
/ 30 марта 2010

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

0 голосов
/ 30 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...