2017-08-13 79 views
2

尋找有關如何改進下面的代碼以最大限度地重複使用的一些建議。 A類有一個矩陣成員,用於幾種方法。 B類與A類相同(這些方法是直接複製粘貼),但是矩陣成員不同且類型不同。使用完全相同的方法構建類但使用不同成員類型的最佳方法

class A 
{ 
public: 
    A() { set_matrix(); }; 
    double operator()() { // uses method1 and method2 }; 
protected: 
    Matrix_Type_A matrix; 
    void set_matrix(); 
    double method1() { // uses matrix }; 
    double method2() { // uses matrix }; 
} 

class B 
{ 
public: 
    B() { set_matrix(); }; 
    double operator()() { // uses method1 and method2 }; 
protected: 
    Matrix_Type_B matrix; 
    void set_matrix(); 
    double method1() { // uses matrix. Identical to method1 in class A }; 
    double method2() { // uses matrix. Identical to method2 in class A }; 
} 

理想情況下,我想重新使用類方法,其中底層代碼適用於兩種矩陣類型。

我最初的想法是創建一個具有新成員矩陣一個子類,但我不認爲這會工作,因爲繼承的方法仍然指向基類的變量,而不是衍生變量。例如。是這樣的:

class A 
{ 
public: 
    A() { set_matrix(); }; 

protected: 
    Matrix_Type_A matrix; 
    void set_matrix(); 
    double method1() { // uses matrix }; 
    double method2() { // uses matrix }; 
} 

class B : class A 
{ 
private: 
    Matrix_Type_B matrix; 
    void set_matrix(); 
} 

可替換地,在想,我可以用含有該方法的一般基類,然後繼承類A和B類的每個與不同的矩陣構件。問題是,基類不會編譯,因爲這些方法引用只存在於派生類中的成員。

任何意見/想法如何構建這非常讚賞。

編輯

模板解決方案似乎工作。我已經實現了以下

template <class T> class A 
{ 
public: 
    A() { set_matrix(); }; 

protected: 
    T matrix; 
    virtual void set_matrix() = 0; 
    double method1() { // uses matrix }; 
    double method2() { // uses matrix }; 
} 

class B : class A<Matrix_Type_A> 
{ 
public: 
    B() { set_matrix(); }; 
private: 
    void set_matrix(); 
}; 

class C : class A<Matrix_Type_B> 
{ 
public: 
    C() { set_matrix(); }; 
private: 
    void set_matrix(); 
} 
+2

這聽起來像一個模板類。 –

+0

避免在構造函數中調用虛方法,您可以使用專用而不是繼承,然後使用別名:'使用B = A ;'。 – Jarod42

回答

1

你如何確保Matrix_Type_AMatrix_Type_B有相同的方法?如果它們都是聲明共享功能的共同父代的兩個子類(或者如果您可以讓它們共享這樣的父代),只需聲明您的matrix變量爲該父類型。

如果沒有,你可以做一個模板類:

template<class Matrix> 
class C 
{ 
    ... 
protected: 
    Matrix matrix; 
    ... 
} 

,並使用C<Matrix_Type_A>C<Matrix_Type_B>爲您的類。

相關問題