Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从索引外捕获异常_C++_Class_Exception_Exception Handling_Try Catch - Fatal编程技术网

C++ 从索引外捕获异常

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

我有一些无法编辑的主文件。有一些事情要做,我正在编写适合主文件的类。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 << 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
只需ise
at
方法,该方法会抛出
std::out\u of\u range
@M。当它超出范围时,它可以完美地工作。但是当我尝试使用v1[2]时,我会得到未处理的异常错误。返回类型是
数据[i]
T*数据为真;
?是的,这是真的。而且,我刚刚将
I>length
更改为
I>=length
。不,我的意思是如果我不想使用v1[2]得到错误怎么办?它给出了那个错误。