2

当我尝试在 Visual Studio 2010 中运行此代码时出现以下错误:

matrix.exe 中 0x012c23d3 处的未处理异常:0xC0000005:访问冲突读取位置 0xccccccd0。

这是代码:

#include <vector>

using namespace std;

class matrix : public vector<vector<char>> {
  public:
    matrix(int x, int y) {
        this->resize(x);
        for (int i = 0; i < y; ++i) {
            this[i].resize(y);
        }
    }
};

void main() {
    matrix mat(10, 10);
}

我正在尝试通过添加内置矩阵操作函数来创建一个matrix扩展类型的类。vector<vector<char>>但是,我无法让这个构造函数正常运行。

谢谢你的帮助。

4

4 回答 4

3

首先,不要从标准容器公开继承:它们不是为此而设计的,没有虚拟析构函数。即使你从不打算让你的派生被基类指针删除,几年后有人会出现并这样做,而没有意识到这个陷阱。protected从标准容器ly 或ly继承private很好,因为您不能尝试以多态方式破坏您的孩子。

那么你的问题是双重的:i < y而不是i < x你的循环条件,this[i]而不是(*this)[i]它会导致它使用父类而不是数组和指针上operator[]的内置运算符。[]

但是你的整个构造函数可以被取消:

matrix(int x, int y) : vector<vector<char> >(x, vector<char>(y)) { }
于 2013-05-22T18:26:34.857 回答
3

我建议重写如下:http: //ideone.com/mzsE8e

#include <vector>
#include <iostream>

template <typename T>
using matrix = std::vector<std::vector<T>>;

template <typename T>
matrix<T> make_matrix(size_t x, size_t y)
{
    return { x, typename matrix<T>::value_type(y) };
}

int main() {
    auto mat = make_matrix<char>(3, 5);


    // for demonstration only:
    for (auto& row : mat)
    {
        for (auto& cel : row)
            std::cout << (int) cel << " ";
        std::cout << "\n";
    }
}
于 2013-05-22T18:27:15.070 回答
3

除了所有其他建议之外,您的问题还在于:

this[i].resize(y);

因为它没有做你想做的事。它正在将 this 的指针移动 i 个字节。由于要访问 [] 运算符,因此需要取消引用指针:

(*this)[i].resize(y);
于 2013-05-22T18:38:39.813 回答
0

试试这个:

class matrix : public vector< vector< char > >
{
public:
    matrix(int x, int y)
    {
        vector< char > _val(y, 0);
        this->resize(x, _val);
    }
};
于 2013-05-22T18:40:52.367 回答