接口方法的实现

时间:2014-08-31 15:52:36

标签: c++ inheritance matrix iterator polymorphism

我想实现矩阵的表示。为此,我有两种类型的矩阵 - 常规和稀疏,它们的实现不同 - 一个包含一个向量,第二个是索引和值的映射,都继承自Matrix类。 为此,我正在使用策略模式,在那里我创建了基本抽象类Matrix,这两个类继承自Matrix - RegMatrixSparseMatrix,以及{{ 1}}包含指向MyMatrix的指针。

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

所以我有两个问题:

  1. 我唯一的提示是创建一个“matrix”类型的迭代器,并为每种类型的矩阵(常规和稀疏)实现迭代器。 我该怎么办呢?

  2. 假设我为两种类型的“矩阵”实现了迭代器。我如何使用不同的迭代器,以防我必须添加两种不同类型的矩阵?我是否必须实施所有4种不同的案例?

  3. 运营商+看起来像:

    +

2 个答案:

答案 0 :(得分:2)

不希望在基类中实现该功能。

在每个子类中实现功能。这将允许使用最佳算法。

或者您可以在Base类中将getter和setter声明为abstract,并在基类实现中使用它们:

struct Matrix_Base
{
  virtual int   get_value(unsigned int row, unsigned int column) = 0;
  virtual void  set_value(int value, unsigned int row, unsigned int column) = 0;
  Matrix_Base operator+(const Matrix_Base& other)
  {
    // perform addition
    int sum = get_value(row, column) + other.get_value(column, row);
    set_value(sum, row, column);
    //...
  }
};

请记住,在传递Matrix时,接收函数只能使用Matrix的常用函数(接口)。对于细节,函数必须在参数列表中使用专门的(后代)。

答案 1 :(得分:0)

您只能为RegMatrix和2个转换运算符实现+运算符: 1.从RegMatrix到SparseMatrix 2.从SparseMatrix到RegMatrix

什么是性能要求?