gpt4 book ai didi

c++ - Operator+ 添加不同类的实例

转载 作者:行者123 更新时间:2023-11-30 05:40:55 25 4
gpt4 key购买 nike

问题陈述:Matrix是一个基类,由 DenseMatrix 子类化和 SparseMatrix (可能还有其他人)。我想要实现的是:

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);

现在,添加 DenseMatrix 时用SparseMatrix已将两者声明为 Matrix意味着必须有一个 operator+ Matrix 中的定义.

我已经读过this answer它使用了一个接口(interface) AddEnabled<Foo> ,但当(几乎)任何可能的被加数组合时,这似乎不是一个好的解决方案。我可以在 DenseMatrix 中定义以下功能:

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

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

根据各种类似的问题和答案,我怀疑 pimpl 习语 可能是相关的,但我不知道如何。

注意:我使用的是 C++98,而不是 C++11。

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

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

在某种程度上这会起作用,但我的代码的用户会期望一个 +返回 Matrix而不是对一个的引用。

最佳答案

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

示例:

Matrix = IdentityMatrix operation DiagonalMatrix

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

关于c++ - Operator+ 添加不同类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31325831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com