Operator() 作为下标 (C++)
-
23-09-2019 - |
题
我这样使用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;
更新:错误文本:
位于 0x651cf54a 的未处理异常 (msvcr100d.dll) in CG.exe:0xC0000005:访问违规读取位置 0xccccccc0。
解决方案
正如我在评论中所说,问题在于你的设计有缺陷。我对以下两件事之一做出 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:0000005: 访问冲突阅读位置 0xccccccc0。
0xcc
是MSVC未初始化存储器字节值。换句话说,你的问题是很可能是由于访问未初始化的指针或指针这是从未初始化存储器的。
问题是,你不double&
你operator()
版本检查超出范围的索引。
您可能无法保证data[i]
指向一个有效的内存地址为一个足够大的i
。您应该检查是否有超出范围的指数,并抛出一些异常或调整你的向量(通过分配更多的内存做data
),以便能够容纳更多的价值。
不隶属于 StackOverflow