当我尝试在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>>
类。但是,我无法让这个构造函数正常运行。
感谢您的帮助。
答案 0 :(得分:3)
首先,不要公开从标准容器继承:它们不适用于它,没有虚拟析构函数。即使你从来没有打算通过基类指针删除你的派生,有人会在几年后出现,并且没有意识到陷阱。继承标准容器protected
或private
是正常的,因为你不能试图多态破坏你的孩子。
然后您的问题有两个:i < y
而不是i < x
在您的循环条件中而this[i]
而不是(*this)[i]
会导致它使用父类{{1}而不是数组和指针上的运算符的内置operator[]
。
但是你的整个构造函数都可以完成:
[]
答案 1 :(得分: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";
}
}
答案 2 :(得分:2)
除了所有其他建议之外,您的问题还在线上:
this[i].resize(y);
因为它没有做你想要的。它正在通过i字节移动这个指针。由于您要访问[]运算符,因此需要取消引用指针:
(*this)[i].resize(y);
答案 3 :(得分:0)
请改为尝试:
class matrix : public vector< vector< char > >
{
public:
matrix(int x, int y)
{
vector< char > _val(y, 0);
this->resize(x, _val);
}
};