2014-08-31 227 views
0

我想實現矩陣的表示。因爲我有兩種類型的矩陣 - 正則和稀疏,它們的實現有所不同 - 一種是向量,另一種是索引和值的映射,它們都繼承自Matrix類。爲此,我使用策略模式,在此創建基本抽象類Matrix,繼承自Matrix - RegMatrixSparseMatrix的兩個類和MyMatrix,其中包含指向Matrix的指針。接口方法的實現

我想要實現+運營商,該運營商在Matrix上運行,並收到另一個Matrix。但是當我實現+運算符時,可能會收到稀疏/常規矩陣參數。

所以我有2個問題:

  1. 我唯一的線索是創造型的迭代器「矩陣」,並實現每種類型的矩陣(經常和稀疏)的迭代器。 我該怎麼做這樣的事情?

  2. 比方說,我爲兩種類型的「矩陣」實現了一個迭代器。我怎樣才能使用不同的迭代器,以防我必須添加兩種不同類型的矩陣?我必須執行所有4種不同的情況嗎?

運營商+樣子:

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

我不會用迭代器做到這一點,但是對於所有三種情況,都使用硬編碼類型檢查和單獨的代碼。如果你認真對待數值編程,不要全部面向對象,至少不要在你的內部循環中。 (儘管模板代碼可能足夠快。) – 2014-08-31 16:06:14

+0

何時以及如何選擇使用哪種實現?這是整個問題的核心問題,並將決定OOP是否有用。 – 2014-08-31 16:15:37

回答

2

不想實現在基類的功能。

在每個子類中實現功能。這將允許使用最佳算法。

或者你可以在Base類中聲明getter和setter抽象及基礎類實現使用它們:

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); 
    //... 
    } 
}; 

記住,傳遞矩陣時,接收功能只能使用常用功能(界面)的矩陣。具體來說,函數將不得不在參數列表中使用專用(後代)。

+0

如果你使用'operator +()',你應該返回一個新的實例到一個矩陣。如果修改現有實例,請使用'operator + =()'。除此之外,如果性能不是要求,並且使用'set/get_value()'函數來實現所有矩陣操作,那麼我會使用這種方法,最好是作爲自由函數而不是成員。 – JarkkoL 2014-08-31 16:21:03

+0

@JarkkoL:好點,但我關注的是getter和setter,而不是實際的實現。 – 2014-08-31 16:25:25

0

您可以實現+運營商只對RegMatrix和2轉換操作符: 1.從RegMatrix到稀疏矩陣 2.從稀疏矩陣來RegMatrix

什麼是性能要求?

+0

沒有具體的性能要求, 但矩陣之間的切換是僅當零的數量小於一半(正常),或超過一半(稀疏) – 2014-08-31 16:14:31