C++ 从索引外捕获异常
我有一些无法编辑的主文件。有一些事情要做,我正在编写适合主文件的类。v1对象是我自己的向量类的一个实例 在主要的某一点上,我有这条线C++ 从索引外捕获异常,c++,class,exception,exception-handling,try-catch,C++,Class,Exception,Exception Handling,Try Catch,我有一些无法编辑的主文件。有一些事情要做,我正在编写适合主文件的类。v1对象是我自己的向量类的一个实例 在主要的某一点上,我有这条线 try { // trying to get the element at(4) // should give an error cout << v1[4] << endl; } catch (const string & err_msg) { cout << err_msg <&l
try {
// trying to get the element at(4)
// should give an error
cout << v1[4] << endl;
} catch (const string & err_msg) {
cout << err_msg << endl;
}
试试看{
//尝试在(4)处获取元素
//应该给出一个错误
在不修改主代码的情况下,您应该编写自己的向量类来检查操作符[]
中的边界
比如:
template <typename T>
class MyVector
{
T *data;
int length;
...
T &operator[](int i)
{
if (i < 0 || i >= length)
throw std::string("Out of bounds!"); //throw std::out_of_range;
else
return data[i];
}
...
};
模板
类MyVector
{
T*数据;
整数长度;
...
T&operator[](国际一级)
{
如果(i<0 | | i>=长度)
抛出std::string(“超出范围!”;//抛出std::超出范围;
其他的
返回数据[i];
}
...
};
否则,如果使用的是std::vector
,则可以使用而不是[]
:
返回对指定位置边界处元素的引用
执行检查后,将显示类型std::out_超出_范围的异常
在无效访问时抛出
所以你有一个自己的类,v1
是你的类的一个实例吗?你能给出操作符[]
的定义吗?如果v1
是一个std::vector
,那么你就卡住了。你必须修改代码。@AndyProwl我需要重载[]?我没有为那个操作符做任何特别的事情。我所做的只是自己创建一个v1向量。@juanchopanza我创建了自己的向量类继承STL向量。这一步没有什么要做的吗?@AndyProwl很好。我只是扔掉了代码。我不知道这是否算作修改:)所以我理解的是,我需要重写ad[]使用at()函数检查索引边界。重载方法体将在cout给出错误之前引发异常,对吗?如果您正在编写自己的向量,则是重载运算符[]
。如果您使用std::vector
只需iseat
方法,该方法会抛出std::out\u of\u range
@M。当它超出范围时,它可以完美地工作。但是当我尝试使用v1[2]时,我会得到未处理的异常错误。返回类型是数据[i]
对T*数据为真;
?是的,这是真的。而且,我刚刚将I>length
更改为I>=length
。不,我的意思是如果我不想使用v1[2]得到错误怎么办?它给出了那个错误。