用类似类型C++的类执行函数

performing function with classes of similar type C++

本文关键字:执行 函数 类型 C++      更新时间:2023-10-16

我想要实现矩阵的表示。为此,我有两种类型的矩阵-正则矩阵和稀疏矩阵,它们在实现-一个保存向量,第二个保存索引和值的映射,两者都继承自Matrix类。

我想实现+运算符,它对矩阵进行运算并接收另一个矩阵。但当我实现+运算符时,我可能会接收作为参数的稀疏/正则矩阵。

有没有办法接收矩阵,我不知道它是2的哪种类型,并执行+运算符?意思是,如果在类SparseMatrix中,我接收稀疏/正则矩阵,我如何实现运算符,使无论我得到两种类型中的哪一种,它都能工作?

Matrix & operator+ (Matrix other)
{
    ...
}

我可能会实现operator+的两个版本,并让它们调用一个助手模板方法:

template <typename ITER>
Matrix add (ITER other_it) {
    //...
}
Matrix operator+ (RegularMatrix other)
{
    return add(other.begin());
}
Matrix operator+ (SparseMatrix other)
{
    return add(other.begin());
}

您可以将operator+作为模板,但这样可以确保只允许使用那些Matrix类型。

正如我所指出的,您不应该从+返回引用,因为结果需要指向操作返回后存在的实例。

我们可以使用多态性来创建矩阵的不同实现。通过Matrix的公共接口,每个实现都可以进行交互。

   class Matrix
   {
      class iterator { ... }
      friend Matrix operator+(const Matrix &lhs, const Matrix &rhs)
      {
         // iterate, add, and return new matrix
      }
   };
   class SpareMatrix : public Matrix
   {
      iterator begin() { ... }
   };
class Matrix
{
public:
    virtual ~Matrix() {}
    virtual Matrix& operator+(Matrix& other) = 0;
};
class MatrixSparse : public Matrix
{
public:
    virtual ~MatrixSparse() {}
    virtual Matrix& operator+(Matrix& other)
    {
        MatrixSparse* sparse = dynamic_cast<MatrixSparse*>(&other);
        // TODO
    }
};
class MatrixRegular : public Matrix
{
public:
    virtual ~MatrixRegular() {}
    virtual Matrix& operator+(Matrix& other)
    {
        MatrixRegular* regular = dynamic_cast<MatrixRegular*>(&other);
        // TODO
    }
};

此外,这里还有另一个SO线程处理从抽象类重载运算符的问题。