【问题标题】:Throwing exception when array is out of bounds数组越界时抛出异常
【发布时间】:2013-03-24 14:36:54
【问题描述】:

我有一个矩阵类,它使用 [][] 来访问元素。当一个(或两个)索引超出范围时,我必须抛出 CIndexException。这是一个以“无效索引 [a][b]”格式存储文本的类,其中 a 和 b 是数字。

这是我当前的 CIndexException 类实现

class CIndexException
{
    string text;
public:
    CIndexException (int a, int b)
    {
        ostringstream oss;
        oss << "Invalid index [";
        oss << a;
        oss << "][";
        oss << b;
        oss < "]";

        text = oss.str();
     }

     string get() const
     {
         return text;
     }
};

矩阵表示为一个二维数组,在构造函数中初始化:

CMatrix(int r, int c)
{
    colls = c;
    rows = r;
    mat = new double * [rows];

    for (int i = 0; i < rows; i++)
    {
        mat[i] = new double [colls];
        for (int j = 0; j < colls; j++)
            mat[i][j] = 0;
    }
}

为了获得单个元素,我像这样重载了 [] 运算符:

double * operator[] (int x) const
{
    return mat[x];
}

当我键入 a[2][3] 时,此函数解析第一个 [],返回指向数组的指针,然后像往常一样解析第二个 []。

我可以轻松地检查第一个索引是否超出范围,但我无法检查第二个索引。我想创建第二个类 MatrixRow,它代表一行矩阵。然后我会有 MatrixRows 数组。为了使 [][] 工作,这两个类都将重载 operator[]。这样我就可以检查两个索引,但我不知道如何将它们“加入”到一个异常中。使用此设计时如何在异常对象中报告两个索引?

【问题讨论】:

  • 你已经回答了你的问题,你需要创建一个MatrixRow 类,在上面重载[] 运算符,你就完成了。有什么问题?
  • 我看不到问号。
  • @antonijn -- 问题是MatrixRow 类需要报告异常中使用的两个索引,但通常它只知道列。

标签: c++


【解决方案1】:

使用您的MatrixRow 解决方案,但将行的索引作为构造函数参数传递给每个MatrixRowMatrixRow 可以保存该数字,并在它生成的任何异常消息中使用它。

【讨论】:

    【解决方案2】:

    使用operator()() 而不是operator[]()。请参阅此link。您需要此链接考虑的所有内容。

    【讨论】:

    • 这太丑了。这些矩阵使用特殊的非 C++ 语法进行索引。
    • m[i][j] 说:“你好m(i,j)。你好丑,但你工作这么好,你的设计也简单得多。为什么?”
    • 同一个应用程序也可能使用一维数组(向量)。他们还会重载 operator() 吗?现在它们不同于原生数组和 std::vector;混乱随之而来。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多