2011-02-10 88 views
0

比方說,我有一個基類模板MyBase:子類有不同的陣列實現

template <class T> 
class MyBase{ 
private: 
    T data; 
public: 
    MyBase(T _data); 
}; 

我想(至少目前如此)兩次此類子:

  1. 數據應該是一個動態的2維數組:T **data
  2. 數據應該是一個固定的2維數組:T data[rows][cols]

我仍然是一個C++新手,我不知道如何做到這一點。 具體來說,我想製作一種矩陣庫(主要是作爲一個學習項目)。過去我做過一些事情,我的矩陣動態存儲更有意義,反之亦然。所以,看起來好的解決方案是實現一個提供所有常用功能的基類(例如insert(T item, int i, int j),無論在哪種情況下都應該使用data[i][j] = item;),然後繼承DynamicMatrix和FixedMatrix。該DynamicMatrix將有一個構造函數,沒有

data = new T*[rows]; 
for (int i = 0; i < rows; i++) 
{ 
    data[i] = new T[cols]; 
} 
for (int i = 0; i < rows; i++) 
{ 
    for (int j = 0; j < cols; j++) 
    { 
     data[i][j] = 0; 
    } 
} 

而且FixedMatrix剛:

for (i=0; i < rows; i++) 
{ 
    for (j=0; j < cols; j++) 
    { 
     data[i][j] = 0;  
    } 
} 

在基類中創建一個成員變量T data;是很容易的。但是,在子類中,我該如何將它轉換爲雙指針?也許我做不到,我沒關係。但是,我應該怎麼做呢?

+2

你能詳細解釋一下這個基類代表什麼,你爲什麼要在這裏使用繼承,以及你有什麼麻煩? – templatetypedef 2011-02-10 05:43:43

+0

當然,讓我編輯這個問題。 – jakev 2011-02-10 05:44:49

回答

3

在這裏,您嘗試使用繼承進行代碼重用,在我看來,這不是一種好的設計方法;繼承是爲了實現自由,而構成是爲了代碼重用。

在這種情況下,如果它是真的有必要支持這些不同的情況,我就正式的二維數組:

template<typename T> class Array2D { 
    public: 
     virtual const T* operator[](int row_index) const = 0; 
     virtual T* operator[](int row_index) = 0; 
     virtual size_t rows() const = 0; 
     virtual size_t cols() const = 0; 
}; 

然後,我將提供Array2D的實現,您指定:

template<typename T, int R, int C> class FixedArray2D : public Array2D { 
    public: 
     virtual const T* operator[](int row_index) const { 
      return &data_[row_index][0]; 
     } 
     virtual T* operator[](int row_index) { 
      return &data_[row_index][0]; 
     } 
     virtual size_t rows() const { return R; } 
     virtual size_t cols() const { return C; } 
    private: 
     T data_[R][C]; 
}; 

template<typename T> class DynamicArray2D : public Array2D { 
    public: 
     DynamicAray2D(int rows, int cols) { 
      // ... 
     } 
     // ... 
}; 

此時,您可以使用任一格式實例化Array2D。現在無論你使用什麼代碼,只要需要處理這樣一個對象,只需要一個const Array2D&Array2D&。這就是說,我認爲這可能是不必要的複雜性,因爲動態大小的數組可能適用於任何一種情況,因此除非有令人信服的理由支持這兩種類型,否則我只會繼續這樣做。