1

次のように、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:エラーテキスト:

CG.exeの0x651cf54a(msvcr100d.dll)で未処理の例外:0xC0000005:アクセス違反の読み取り場所0xccccccc0。

4

4 に答える 4

2

コメントで言ったように、問題はあなたの欠陥のあるデザインです。私は次の2つのうちの1つを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]);
}
于 2010-03-29T22:37:54.610 に答える
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;より意味のあるものに変更することも検討する必要があります。

于 2010-03-29T22:33:40.463 に答える
1

CG.exeの0x651cf54a(msvcr100d.dll)で未処理の例外:0xC0000005:アクセス違反の読み取り場所0xccccccc0。

0xccMSVCの初期化されていないメモリバイト値です。つまり、問題は、初期化されていないポインタまたは初期化されていないメモリから派生したポインタにアクセスしたことが原因である可能性があります。

于 2010-03-29T23:07:44.460 に答える
0

double&問題は、のバージョンで範囲外のインデックスをチェックしないことですoperator()

おそらく、それがdata[i]十分な大きさの有効なメモリアドレスを指していることを保証することはできませんi。範囲外のインデックスをチェックして例外をスローするか、ベクトルのサイズを変更して(より多くのメモリを割り当てることによりdata)、より多くの値を保持できるようにする必要があります。

于 2010-03-29T22:33:09.403 に答える