我有一个用于存储从通用ListAsArray类继承的 vector 的类,但是当我尝试创建由这些 vector 类组成的矩阵时,会遇到分段错误。我的问题的一般示例如下:
#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 *类型的矩阵。
预先感谢您的任何帮助。
最佳答案
您正在 slice 对象。当您分配ListAsVector
数组时,每个对象都包括该std::vector<>
成员。但是,您可以使用ListAsArray*
来访问序列。因此,matrix[i]
大于零的i
对指针类型ListAsArray*
(它非常小,因为它没有成员,但是包含一个vtable)执行常规的指针算术。
只需将matrix
的类型更改为ListAsVector*
即可。 (最好还是使用智能指针,或者只使用std::vector<ListAsVector>
)。 ListAsArray
引用仍然适用于operator[]
,指针数学将再次适用于世界。