2014-09-02 112 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); 
}