2017-08-13 4 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それぞれを継承していることを考えていました。問題は、メソッドが派生クラスにのみ存在するメンバーを参照するため、基本クラスがコンパイルされないことです。

これをどのように構造化するかに関するアドバイスやアイデアは高く評価されています。

EDIT

テンプレートのソリューションは、動作しているようです。私はどのようにMatrix_Type_AMatrix_Type_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

コンストラクタで仮想メソッドを呼び出さないようにするには、継承の代わりに特殊化を使用して、別名を使用します。 'using B = A ;'。 – Jarod42

答えて

1

を実装しましたか?それらが共用機能を宣言する共通の親のサブクラスである場合(またはそれらを親のように共有できる場合)は、matrix変数をその親タイプに宣言するだけです。

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

をし、あなたのクラスなどC<Matrix_Type_A>またはC<Matrix_Type_B>を使用します。

ない場合は、テンプレートクラスを作ることができます。

関連する問題