Operator()作为下标(C ++)

时间:2010-03-29 22:26:25

标签: c++ operator-keyword subscript

我以这种方式使用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处的未处理异常   CG.exe中的(msvcr100d.dll):0xC0000005:   访问违规阅读位置   0xccccccc0。

4 个答案:

答案 0 :(得分:2)

正如我在评论中所说,问题在于你的设计有缺陷。我对以下两件事之一做出100%保证:

  1. 传递给赋值函数的值超出有效范围。
  2. 成员data指向内存中的无效空间。
  3. 在任何一种情况下,我都会建议添加:

    #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 :(得分: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;更改为更有意义的内容。

答案 2 :(得分:1)

  

0x651cf54a处的未处理异常   CG.exe中的(msvcr100d.dll):0xC0000005:   访问违规阅读位置   0xccccccc0。

0xcc是MSVC未初始化的内存字节值。换句话说,您的问题很可能是由于访问未初始化的指针或从未初始化的内存派生的指针。

答案 3 :(得分:0)

问题是您没有在double& operator()版本中检查超出范围的索引。

您可能无法保证data[i]指向足够大i的有效内存地址。您应该检查超出范围的索引并抛出一些异常或调整向量的大小(通过分配更多的内存data)以便能够容纳更多的值。