2016-09-29 54 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