簡體   English   中英

在基類對象內部創建派生類對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM