我想实现矩阵的表示。 因为我有两种类型的矩阵 - 常规和稀疏,它们的不同 实现 - 一个包含一个向量,第二个包含索引和值的映射, 都继承自Matrix类。
我想实现+运算符,它在Matrix上运行并接收另一个Matrix。 但是当我实现+运算符时,我可能会收到参数稀疏/常规矩阵。
有没有办法接收矩阵,我不知道它是什么类型的2, 并执行+运算符? 意思是,如果在SparseMatrix类中我收到稀疏/常规矩阵,我怎样才能实现运算符,这样无论我得到哪两种类型,它都会起作用?
Matrix & operator+ (Matrix other)
{
...
}
答案 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处理从抽象类重载运算符的问题。