2014-09-02 175 views
0

我正在根據策略模式實現矩陣。 因爲我有MyMatrix,它包含一個指向Matrix的指針,以及兩個從Matrix繼承的子類 - SparseMatrix & RegMatrix。當我添加兩個矩陣時,因爲我無法知道哪個矩陣被添加到哪個矩陣中,我實現了一個使用每個繼承類的內部方法的基本函數,並且在添加時 - 我只是將新元素添加到左邊矩陣。在基類對象內創建派生類對象

這工作正常。

我的問題是 - 我現在想執行矩陣乘法。 我想在基類 - 矩陣中實現此方法。 這是我到現在爲止:

Matrix& multiple(Matrix &other) 
{ 
    double result = 0; 
    int newMatrixRowSize = getRowSize(); 
    int newMatrixColSize = other.getColSize(); 
    double *resultArray = new double[newMatrixRowSize*newMatrixColSize]; 
    for (int i = 1; i <= getColSize(); i++) 
    { 
     for (int j = 1; j <= other.getColSize(); j++) 
     { 
      for (int k = 1; k <= other.getRowSize(); k++) 
      { 
       Pair firstPair(i,k); 
       Pair secondPair(k,j); 
       result += getValue(firstPair)*other.getValue(secondPair); 
      } 
      Pair resultIndex(i,j); 
      resultArray[getNumIndex(resultIndex, newMatrixRowSize, newMatrixColSize)] = result; 
      result = 0; 
     } 
    } 
    delete [] resultArray; 
} 

唯一的問題是,現在我不能只是添加了新的元素,左手矩陣,我要創建一個新的RegMatrix或稀疏矩陣,並根據數量矩陣中的零點 - 交換到矩陣的合法表示。

所以我的問題是 - 它是「合法的」或良好的做法,在基類內創建一個基類派生類的實例? 我想避免使用工廠模式,並且更願意在不知道手中的矩陣類型的情況下做多形的事情

+0

「我想避免使用工廠模式,並且更願意在不知道手中的矩陣類型的情況下做些多態的事情「你沒有矩陣。你只打算創建一個。在這個階段沒有Matrix對象的多態行爲,因爲沒有Matrix對象。 – 2014-09-02 14:01:29

+0

在Matrix方法內創建矩陣派生對象沒有任何問題。沒有其他方法可以從中返回Matrix對象。你不願意使用工廠模式似乎沒有根據。 – 2014-09-02 14:04:24

回答

0

如果要根據條件創建不同類型的對象,則必須使用工廠。如果你不想讓Matrix知道它的後代,你有幾種選擇。除了implementations using interfaces,在C++ 11可以使用std::function

class Matrix { 
    typedef std::function<Matrix*(const double*, int, int)> Factory; 
    Factory factory; 
public: 
    Matrix(const Factory& f) : factory(f) {} 
    Matrix* multiple(Matrix &other) { 
     .... 
     return factory(resultArray, newMatrixRowSize, newMatrixColSize); 
    } 
}; 

它給你的優勢,你可以通過任何功能狀物體作爲工廠:

Matrix* matrixFactoryFunc(const double* data, int rowSize, int colSize) { 
    return nullptr; 
} 

class MatrixFactoryCallable { 
public: 
    Matrix* operator()(const double* data, int rowSize, int colSize) { 
     return nullptr; 
    } 
}; 

class MatrixFactoryWithMemFun { 
public: 
    Matrix* createMatrix(const double* data, int rowSize, int colSize) { 
    } 
}; 

void testFactory() { 
    std::function<Matrix*(const double*, int, int)> factory; 

    factory = matrixFactoryFunc; 

    factory = MatrixFactoryCallable(); 

    MatrixFactoryWithMemFun mi; 
    factory = std::bind(&MatrixFactoryWithMemFun::createMatrix, &mi, _1, _2, _3); 

    Matrix m(factory); 
} 
相關問題