2016-09-29 71 views
1

我有一个类存储从通用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 *类型的矩阵。

非常感谢您的帮助。

+2

你[切片](https://stackoverflow.com/questions/274626/what-is-object-slicing)你的对象序列.'matrix [i]'表示为'ListAsArray' * object *,不是指向某个“ListAsVector”对象的引用或指针。因此,只有第一个位于适当的边界上。 – WhozCraig

+0

@WhozCraig那么我该如何解决这个问题呢? – Keagansed

+0

@WhozCraig如果我将它更改为ListAsArray **矩阵;并将初始化更改为matrix = new ListAsVector * [rows];我得到一个错误,说:从'ListAsVector **'无效转换为'ListAsArray **' – Keagansed

回答

3

您正在切片的对象。当你分配一个ListAsVector的数组时,每个对象都包含那个std::vector<>成员。但是,您使用ListAsArray*访问序列。因此,matrix[i]其中i大于零,对指针类型ListAsArray*执行常规指针运算(这非常小,因为它没有成员,但确实容纳了一个vtable)。

只需将matrix的类型更改为ListAsVector*即可。 (更好的是,使用智能指针,或者只使用std::vector<ListAsVector>)。参考ListAsArray仍然适用于operator[],指针数学将再次与世界正确。

+0

好的,我会这样做,非常感谢你的帮助! – Keagansed