设置2D矩阵时避免出现分段错误
问题描述:
我有一个类存储从通用ListAsArray类继承的向量,但是当我尝试创建由这些向量类组成的矩阵时,我得到了分段错误。我的问题的一个通用示例如下:设置2D矩阵时避免出现分段错误
#include <iostream>
#include <vector>
using namespace std;
class ListAsArray
{
public:
virtual void addToEnd(int i) = 0;
virtual int operator[](int i) = 0;
};
class ListAsVector : public ListAsArray
{
public:
void addToEnd(int i)
{
vec.push_back(i);
}
int operator[](int i)
{
return vec[i];
}
private:
vector<int> vec;
};
class FixedSizeMatrix
{
public:
FixedSizeMatrix(int rows, int columns)
{
int count = 0;
this->rows = rows;
this->columns = columns;
matrix = new ListAsVector[rows];
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < columns; ++j)
{
matrix[i].addToEnd(count++);
}
}
}
ListAsArray& operator[](int i)
{
return matrix[i];
}
private:
ListAsArray* matrix;
int rows;
int columns;
};
int main() {
FixedSizeMatrix m(1,2);
cout<<m[0][0]<<endl;
return 0;
}
只有当我尝试创建一个多行的矩阵时才会出现此问题。当我将矩阵的类型从ListAsArray *更改为ListAsVector *时,问题就消失了,因此需要某种类型的强制类型转换,但我尝试了几乎所有的操作,但都没有成功。
因为这是一项任务,我不得不拥有ListAsArray *类型的矩阵。
非常感谢您的帮助。
答
您正在切片的对象。当你分配一个ListAsVector
的数组时,每个对象都包含那个std::vector<>
成员。但是,您使用ListAsArray*
访问序列。因此,matrix[i]
其中i
大于零,对指针类型ListAsArray*
执行常规指针运算(这非常小,因为它没有成员,但确实容纳了一个vtable)。
只需将matrix
的类型更改为ListAsVector*
即可。 (更好的是,使用智能指针,或者只使用std::vector<ListAsVector>
)。参考ListAsArray
仍然适用于operator[]
,指针数学将再次与世界正确。
+0
好的,我会这样做,非常感谢你的帮助! – Keagansed
你[切片](https://stackoverflow.com/questions/274626/what-is-object-slicing)你的对象序列.'matrix [i]'表示为'ListAsArray' * object *,不是指向某个“ListAsVector”对象的引用或指针。因此,只有第一个位于适当的边界上。 – WhozCraig
@WhozCraig那么我该如何解决这个问题呢? – Keagansed
@WhozCraig如果我将它更改为ListAsArray **矩阵;并将初始化更改为matrix = new ListAsVector * [rows];我得到一个错误,说:从'ListAsVector **'无效转换为'ListAsArray **' – Keagansed