2014-09-02 5 views
0

저는 전략 패턴에 따라 행렬을 구현하고 있습니다. Matrix에 대한 포인터를 보유하고있는 MyMatrix와 Matrix-SparseMatrix & RegMatrix를 상속받은 두 개의 하위 클래스가 있습니다. 두 개의 행렬을 추가 할 때 어느 행렬에 어떤 행렬을 추가하는지 알 수 없기 때문에 각 상속 클래스의 내부 메서드를 사용하는 기본 함수를 구현했으며 추가 할 때 - 왼쪽에 새 요소를 추가하기 만합니다. 매트릭스.기본 클래스 객체 내부에서 파생 클래스 객체 만들기

잘 작동합니다.

내 문제는 - 이제 행렬 곱셈을 수행하려고합니다. 이 메서드는 기본 클래스 인 Matrix에서 구현하려고합니다. 이것은 내가 무엇을 가지고 지금까지 :

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의 수 - 행렬의 적법한 표현으로 바꿉니다.

내 질문은 - 그것은 "합법적 인"또는 기본 클래스의 인스턴스를 만드는 좋은 연습은 기본 클래스 안에 파생 된 클래스? 팩토리 패턴을 사용하지 않으려 고하고 행렬의 종류를 알지 못하면 다형성을 더 기꺼이 수행하고자합니다.

+0

"나는 피하려고를 팩토리 패턴을 사용하고, 손에있는 행렬의 종류를 모른 채로 다형성을 기꺼이 수행하려고합니다. "행렬이 없습니다. 당신은 하나만 창조하려고합니다. Matrix 객체가 없으므로이 단계에서는 Matrix 객체의 다형성 동작이 없습니다. –

+0

Matrix 메서드 내에서 Matrix 파생 개체를 만드는 데 아무런 문제가 없습니다. Matrix 객체를 반환하는 다른 방법은 없습니다. 공장 패턴을 사용하기를 꺼리는 것은 잘 정립되지 않은 것처럼 보입니다. –

답변

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); 
} 
관련 문제