在基类对象内部创建派生类对象
Creating a derived class object inside of base class object
我正在根据策略模式实现矩阵。为此,我有MyMatrix,它保存了一个指向Matrix的指针,还有两个继承自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或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);
}
相关文章:
- 如何使用单独文件中的派生类访问友元函数对象
- 使用基类指针创建对象时,缺少派生类析构函数
- 为什么此派生对象无法访问基类的后递减方法?
- 将带有派生模板的对象传递给接受具有基本模板的对象的功能
- 放置派生C++的新基子对象
- 在 C++ 中将对象转换为派生类型
- 链表包含 c++ 中不同的派生类对象
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- 如何在新的派生对象中获取基本对象的数据?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 获取我的基类以递增派生类对象整数
- 派生类中的对象
- 在没有默认构造函数的情况下创建的派生对象
- OOP 标识派生对象
- 如何创建派生对象的向量?
- 按基类对象访问派生类资源时出错
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- static_cast将此对象派生到C++中的基类
- 如何在构造函数完成后立即销毁从 QWindow 对象派生的内容
- 我可以判断std::type_info对象是否等于另一个对象或从另一个对象派生的类吗?