【问题标题】:Overloading operator[] keeps throwing a runtime error重载 operator[] 不断抛出运行时错误
【发布时间】:2019-12-01 15:06:00
【问题描述】:

好的,所以我正在尝试创建一个 Matrix 类,并且我真的非常希望能够通过使用括号来调用元素。采用 mMatrix[x][y] 的风格。

所以我有一个vector<vector<T>> 成员,当重载[] 运算符时,我返回一个对vector<T> 对象的引用。

template<class T>
class Matrix
{
private:
    uint32_t DimensionHorizontal;
    uint32_t DimensionVertical;

    std::vector<std::vector<T>> matrix;

public:
    Matrix()
    {
        DimensionHorizontal = 10;
        DimensionVertical = 10;
    }

    std::vector<T>& operator[] (int index)
    {
        return matrix.[index];

    }

    Matrix(int x, int y)
    {
        DimensionHorizontal = x;
        DimensionVertical = y;
    }
};

这似乎有效,因为当我创建一个 Matrix 对象并尝试通过执行 Matrix[a][n] (在这种情况下使用整数)添加一个元素时,它编译没有问题。后来我尝试用 cout 打印出存储在那里的值。

在运行时,我收到以下错误

表达式:向量第 1455 行的向量下标超出范围。 第 1455 行:

_NODISCARD size_type capacity() const noexcept { // return current length of allocated storage
        auto& _My_data = _Mypair._Myval2;
        return static_cast<size_type>(_My_data._Myend - _My_data._Myfirst);
    }

    _NODISCARD _Ty& operator[](const size_type _Pos) noexcept { // strengthened
        auto& _My_data = _Mypair._Myval2;
#if _CONTAINER_DEBUG_LEVEL > 0
        _STL_VERIFY(
            _Pos < static_cast<size_type>(_My_data._Mylast - _My_data._Myfirst), "vector subscript out of range");
#endif // _CONTAINER_DEBUG_LEVEL > 0

        return _My_data._Myfirst[_Pos];
    }

我有点困惑为什么会这样。我知道我正在尝试访问越界的东西,或者做一些非法的事情,但是 Matrix[] 应该返回一个向量,我应该能够再次使用 [] 来访问元素 T(在这种情况下为 int),任何帮助,将不胜感激。

编辑:

这就是我使用类的方式

int main()
{
    Matrix<int> a(10, 10);
    a[0][0] = 10;
    std::cout << a[0][0];
    return 0;
}

【问题讨论】:

  • 尝试返回matrix.at(index);,因为很明显您的索引大于您的向量
  • 这会在内存位置 0x000000633CD9F250 的异常中在 0x00007FFCC2A69129 处引发 Exception Unhandled 异常:std::out_of_range。发生了。捕获异常并将其打印出来说“Invalid Vector subscript
  • 代码从不调整 matrix 的大小以匹配尺寸。
  • vector 不会自动处理吗?还是仅当我使用 push_back() 时?
  • 坦率地说,我没想到我必须调整向量的大小,因为我认为当尝试添加新元素时它们会动态分配空间。例如,我可以声明一个 vector 并使用 push_back 继续添加任意数量的整数。我并没有意识到使用 [] 运算符会有所不同。万一现在还不是很明显,我对此很陌生^^无论如何,我学到了一些新东西,所以谢谢

标签: c++ overloading operator-keyword


【解决方案1】:

您需要在构造函数中调整矩阵的大小以匹配作为参数传递的大小。

 Matrix(int x, int y) : matrix(x)
 {
    for( auto& sub : matrix ) {
       sub.resize(y);
    }
    DimensionHorizontal = x;
    DimensionVertical = y;
 }

【讨论】:

  • 感谢您的回答,但这似乎并没有解决问题。与之前相同的错误:/
  • for (sub : matrix) 完全错误,缺少auto ,即使这样,它也会调整内部向量的副本。请改用for (auto &amp; sub : matrix) sub.resize(y);
  • 天哪,这行得通,我早些时候发现了丢失的汽车,但我并没有意识到它必须是一个参考。谢谢@Daniel 说恢复莫妮卡我已经在这几天了
  • 抱歉有点着急,一般我先编译代码...
猜你喜欢
  • 1970-01-01
  • 2017-08-24
  • 2013-11-24
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多