运算符+ 用于添加不同类的实例

Operator+ to add instances of different classes

本文关键字:同类 实例 添加 用于 运算符      更新时间:2023-10-16

问题陈述:MatrixDenseMatrixSparseMatrix(可能还有其他(子类化的基类。我想实现的是:

Matrix *A = new DenseMatrix();
Matrix *B = new SparseMatrix();
Matrix C = (*A) + (*B); // dense + sparse
Matrix D = (*A) + (*A); // dense + dense
Matrix E = (*B) + (*B); // sparse + sparse

更好的是,我希望有以下内容:

DenseMatrix C = (*A) + (*B);
DenseMatrix D = (*A) + (*A);
SparseMatrix E = (*B) + (*B);

现在,当添加带有SparseMatrixDenseMatrix时,将两者声明为 Matrix 意味着Matrix中必须有一个operator+定义。

我已经阅读了这个答案,它使用了接口AddEnabled<Foo>,但是当(几乎(任何可能的求和组合时,似乎不是一个好的解决方案。我可以DenseMatrix定义以下函数:

friend DenseMatrix operator+ (DenseMatrix const& left, DenseMatrix const& right);

但话又说回来,不可能添加两个声明为 Matrix DenseMatrix实例(即 Matrix *A = new DenseMatrix(); (。

从各种类似的问题和答案中,我怀疑痘痘成语可能是相关的,但我看不出如何。

注意:我用 C++98 编码,而不是 C++11。

更新:正如Dieter Lücking在他的回答中建议的那样,需要在基类中引入opeator+。这是有道理的,但问题是Matrix是抽象的,不允许返回抽象类型的方法。但是,可以返回指向Matrix的指针或引用;这样我们就会有一个定义,比如:

Matrix& operator+(const Matrix& right) const;

在某种程度上,这是可行的,但我的代码的用户希望+返回Matrix而不是对的引用。

您可以为基类提供一个指示矩阵布局的状态 - 有了这个状态,相应地调度矩阵操作(在基类上(。保留用于构造的特殊矩阵类,但在应用操作后,它们将省略到基矩阵。

例:

Matrix = IdentityMatrix operation DiagonalMatrix

这将省略参数类型并导致矩阵具有状态"对角线">

如果你在子类中重新定义 Matrix::operator+ 并将其初始化为

Matrix *A = new DenseMatrix();

还有为什么操作员+不是DenseMatrix的成员?我的意思是

DenseMatrix DenseMatrix::operator+ (DenseMatrix const& right) const;

而不是

friend DenseMatrix operator+ (DenseMatrix const& left, DenseMatrix const& right);

是否确实需要在派生类中再次重载运算符+?你不能从基类矩阵继承运算符+吗?

编辑:如果你的基类没有运算符+,但你的派生类有,你仍然需要在基类中声明(但不定义(一个为虚拟的,否则派生类在被Matrix*而不是DenseMatrix*指向时无法覆盖它。

不确定为什么需要多个 + 运算符。矩阵加法是相同的,无论矩阵表示什么:
1. 确保要添加的矩阵具有相同的维度。
2. 从输入矩阵中添加相应的条目以生成输出矩阵中的值。
这些操作将在基类运算符 + 中完成。

然后,您所需要的只是在每个子类中实现getDimensions((,如果它们相等,则执行:
result.put(x, y, inputA.get(x, y( + inputB.get(x, y((;
对于矩阵中的每个条目。