2012-04-01 13 views
2

私の仕事の割り当てにも同様のデザインの質問があります。私はC++のメンバ関数にパラメータとしてメンバ変数を渡しても問題ありませんか?

class base 
{ 
protected: 
    update() 
    { 
    // do some stuff with a and b, call it as action A 
    } 

    int a, b; 
}; 

class derived : public base 
{ 
protected: 
    update() 
    { 
    // want to do the same action A , but with varaiables c and d 
    } 

    int c, d; 
}; 

ような基底クラスを持ち、要件は、派生クラスは、「AとB」および「CとD」asloに作用などの操作の両方を必要とします。それで、update(int、int)のようなメソッドを設計して、必要なときに "aとb" AND "c and d"のようにパラメータを渡して、アクションを実行できるようにするのは大丈夫です。そのアクションを実行するためのヘルパーメソッドを記述してください。しかし、このアクションはこのクラスに固有のものです。私はこれのための他のよりよい選択肢を持てますか?

リアルタイムでは、より大きなクラスと、整数ではないアクションもあります。そのオブジェクトは順番にいくつかのオブジェクトにあり、varibalesはクラスに関連している必要があります。

+0

あなたの質問は意味がありません。定義する整数のいずれもメンバー変数ではありません。それらは 'update'メソッドの外で定義されるはずですか? –

+0

はい、aとbは基本クラスのメンバーです。 cとdは派生クラスメンバーです。私は同じ方法を使用して両方の変数の同じペアを実行する同じアクションをしたい – Amaravathi

答えて

3

派生クラスの実装から基本クラスの実装を呼び出すことができます。 base::update()に電話するだけです。例えばhereを見てください。私はあなたのclass derivedはこのように、is-a関係(あなたが示すように)またはhas-a関係を持っているかどうかを再検討するだろう

+0

質問は異なります.... –

+1

質問は本当に明確ではありません – littleadv

1

:あなたが求めている

class contains 
{ 
protected: 
    base x, y; 
    update() { x.update(); y.update(); } 
}; 
+0

is-a関係。 – Amaravathi

1

何がちょうど

void update(int& a, int &b) 
を定義し、技術的に実現可能です

と本体のupdateはmemebrクラスを忘れていて、常にパラメータを参照して update(a,b)またはと呼びます。

ここで、updateが本当にメンバ関数(他のメンバ変数にもアクセスする必要がある)か、静的メンバ(クラス空間に残っていますが、クラスメンバ自体は表示されません) )、クラス間の関係が正しい場合(単に継承を埋め込むことを意味する)しかし、これらの側面は、単一のコールに関連したものだけ以外の考慮に基づいている必要があります...

2

はい、それは完全に有効です:

class base 
{ 
protected: 
    void update() 
//^^^^ You forgot the return type. 
    { 
     doUpdate(a, b); 
    } 
    void doUpdate(int& x, int& y) 
    { 
    // do some stuff with x and y 
    // Because x and y are passed by reference they affect the original values. 
    } 
private: // Should probaly make the member vars private 
    int a, b; 
}; 

class derived : public base 
{ 
protected: 
    void update() 
//^^^^ You forgot the return type. 
    { 
    doUpdate(c, d); 
    } 
private: // Should probaly make the member vars private  
    int c, d; 
}; 
+0

ありがとうございます。私があなたの答えにもう一つ懸念しているのは、どうしてなぜ更新とdoUpdateが必要なのかという2つの方法です。私たちは目的を達成することができる更新のみを行うことができますか? – Amaravathi

+0

@Amaravathi:2番目のバージョンが異なる署名(2つのパラメータが2番目のバージョンで渡される)があるため、 'doUpdate()'ではなく 'update()'を使用できます。しかし、個人的には(わかりやすくするために)私は2つの異なる名前を使用します。 –

関連する問題