[英]Creating a derived class object inside of base class object
我正在根據策略模式實施矩陣。 為此,我有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或SparseMatrix,並根據矩陣中的零個數交換到矩陣的合法表示形式。
所以我的問題是-在基類內部創建基類派生類的實例是“合法”的還是好的做法? 我想避免使用工廠模式,而更願意在不知道手頭矩陣種類的情況下進行多態操作
如果要根據條件創建不同類型的對象,則必須使用工廠。 如果您不希望Matrix
知道其后代,則有幾種選擇。 除了使用接口的實現之外,在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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.