2012-04-03 11 views
0
class A // abstract class 
{ 
protected: 
    int m_iA; 
    int m_iB; 
    int m_iC; 
    int m_iD; 
    int m_iE 
    ~A(); 
}; 

class B : public A // abstract class 
{ 
protected: 
    double m_dA; 
    double m_dB; 
    double m_dC; 
    double m_dD; 
    ~B(); 
}; 

class C : public B 
{ 
public:  
    C(int iA, int iB, int iC, int iD, int iE, double dA, double dB, double dC, double dD) 
    { 

    } 
} 

質問>あなたは上記の例を見ることができるように、基本クラスABの両方が多くのメンバ変数が含まれています。クラスCからこれらの初期値をベースクラスまで渡すより良い解決策は何ですか?これは基本クラスのメンバー変数を初期化するのに適した場所ですか?

Method1>基本クラスメンバ変数をクラスCのコンストラクタ本体の内部に直接割り当てます。

方法2>コンストラクタのすべての初期値をCからBに、そして最後にAに渡します。

+0

言及しなかった3つ目のオプションがあります。A型とB型の完全に構築されたオブジェクトをCのコンストラクタに渡します(const参照)。 –

答えて

5

AとBのコンストラクタを作成し、初期化値を取得して適用することをお勧めします。次に、CはBのコンストラクタを呼び出し、値を渡します。このようにして、BまたはAから継承する別のクラスが存在する場合、同じパターンに従います。これは、初期化値を必要とするコンストラクタを持つことによってのみ実行できます。 C++ 11を使用して

+2

あなたは非常に良い点を作っています。もしAかBが新しいメンバを追加した場合、新しいパラメータをコンストラクタに追加すると、それらが正しく構築されているか、コンパイルエラーが発生します。 –

2

は初期値を取る基底クラスのコンストラクタを作成し、Cのコンストラクタの初期化リストにそれらを使用しています。ありがとう

2

、あなたが予想より少し少ないオーバーヘッドで逃げることができます:より良いアイデアは初期値が含まれtuplearrayまたはカスタム構造体を取ることです

class A { // abstract class 
protected: 
    int m_iA; 
    int m_iB; 
    int m_iC; 
    int m_iD; 
    int m_iE 
    A(int iA, int iB, int iC, int iD, int iE) 
     : m_iA(iA), m_iB(iB), m_iC(iC), m_iD(iD), m_iE(iE) {} 
    ~A(); 
}; 

class B : public A { // abstract class 
protected: 
    double m_dA; 
    double m_dB; 
    double m_dC; 
    double m_dD;  
    B(int iA, int iB, int iC, int iD, int iE, double dA, double dB, double dC, double dD) 
     : A(iA,iB,iC,iD,iE), m_dA(dA), m_dB(dB), m_dC(dC), m_dD(dD) {} 
    ~B(); 
}; 

class C : public B { 
public: 
    using B::B; 
} 
+0

私はパンチラインを見るために最後まで読んでいなければなりませんでした。 –

+0

@ MarkRansom:ヒントをありがとう。私は* punchline *をいくつかの行を折りたたむことでより見えるようにしようとしました(今はもうスクロールする必要はありません)。 – bitmask

1

、およびBとAのコンストラクタでそれを展開します。次に、Cのコンストラクタは2つのオブジェクトを取るだけです。

+0

これは確かに選択肢です。詳細に応じて「良いアイデア」があるかもしれないし、そうでないかもしれない。 –

0

最初にこのような長いコンストラクタを使用することは好ましくありませんが、どちらの方法でも同じように機能しますが、個人的な選択の問題です。

関連する問題