【问题标题】:Catching exception from out of index从索引外捕获异常
【发布时间】:2023-03-18 14:00:02
【问题描述】:

我有一些无法编辑的主文件。有一些事情要做,我正在编写适合主文件的类。 v1 对象是我自己的矢量类的一个实例。

在 main 的某个点上,我有这条线。

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;
}

我的 v1 向量的大小是“3”,所以程序崩溃了,因为我要超出索引。在这里接受错误是可以的。但是如何在程序崩溃之前获得 cout 行的异常?而且我不允许编辑该主代码。我需要对我的头文件或类定义做一些事情。谢谢。

【问题讨论】:

  • 所以你有一个自己的类,v1 是你的类的一个实例?你能说明你对operator []的定义吗?
  • 如果 v1std::vector 那么你就卡住了。你必须修改代码。
  • @AndyProwl 我需要重载 [] 吗?我没有为那个操作员做任何特别的事情。我所做的只是自己创建一个 v1 向量。
  • @juanchopanza 我创建了自己的向量类,继承了 STL 向量。这一步没有什么可做的吗?
  • @AndyProwl 好点。我会把代码扔掉。我不知道这是否算作修改:)

标签: c++ class exception exception-handling try-catch


【解决方案1】:

在不修改主代码的情况下,您应该编写自己的矢量类来检查operator[] 中的边界。

类似:

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];
  }
  ...
};

否则,如果您使用的是std::vector,则可以使用at 而不是[]

返回对指定位置 pos 的元素的引用。界限 执行检查,std::out_of_range 类型的异常将是 抛出无效访问。

【讨论】:

  • 所以我在这里理解的是;我需要使用 at() 函数重载 [] 来检查索引边界。重载方法体会在 cout 报错之前抛出异常吧?
  • 如果您正在编写自己的向量,请重载operator[]。如果您使用的是std::vector,只需使用抛出std::out_of_rangeat 方法。
  • @MM. 当它越界时它工作得很好。但是当我尝试使用 v1[2] 时;我得到未处理的异常错误。返回类型 data[i];T *data; 是否为真?
  • 是的,这是真的。而且,我刚刚将i&gt;length 更改为i&gt;=length
  • 不,我的意思是如果我不想使用 v1[2] 出错怎么办?它给出了那个错误。
猜你喜欢
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多