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

时间:2014-08-30 20:24:02

标签: c++ inheritance interface iterator polymorphism

我想实现矩阵的表示。 因为我有两种类型的矩阵 - 常规和稀疏,它们的不同 实现 - 一个包含一个向量,第二个包含索引和值的映射, 都继承自Matrix类。

我想实现+运算符,它在Matrix上运行并接收另一个Matrix。 但是当我实现+运算符时,我可能会收到参数稀疏/常规矩阵。

有没有办法接收矩阵,我不知道它是什么类型的2, 并执行+运算符? 意思是,如果在SparseMatrix类中我收到稀疏/常规矩阵,我怎样才能实现运算符,这样无论我得到哪两种类型,它都会起作用?

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

3 个答案:

答案 0 :(得分:0)

我可能会实现两个版本的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类型。

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

答案 1 :(得分:0)

我们可以使用多态来创建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() { ... }
   };

答案 2 :(得分:0)

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

此外,这里是another SO thread处理从抽象类重载运算符的问题。