2012-02-13 15 views
3

私は親クラスを持っており、その親クラスから2つのパブリック派生クラスを持っています。例えば。他の派生クラスから派生クラスのメンバーにアクセスするにはどうすればよいですか?

     class Parent 
         |  | 
         |  | 
         |  | 
       class derived1 class derived2. 

質問: 私は別の派生クラスから派生したクラス1のプライベートメンバーにアクセスしたいと思います。これはどうすればいいですか?

今のところ私は次のようになります: cDerived1オブジェクトをcDerived2のctorにパラメータとして渡します。私はこのようにそれを行う場合は、その後、私はcDerived1の友人としてcDerived2を宣言する必要があり、また、cDerived1.h

#include cParent.h 
#include cDerived1.h 
#include cDerived2.h 

void main(){ 

// Instantiate a cDerived1 object 
Derived1 dev1(); 

// Instantiate a cDerived2 object. The cDerived2 object will need access to the 
// private members of cDerived1. So pass dev1 by reference to dev2 ctor. 
Derived2 dev2(dev1); 
} 
cDerived2.h

内を含め、これはそれを行うには正しい方法ですか私は非常に露骨に何かをやっています違う ??

ありがとうございました。

Paulさんのコメントに応じて: 私は既に以下のように親クラスに共有コードを持っています。

cParent.h 
class cparent{ 

public: 
// ctor 
// dtor 
protected: 
int* pArr; 
}; 

cDerived1.h 
// derived1's header 
#include "cParent.h" 

class cDerived1 : public cParent{ 
public: 
// 
}; 


cDerived2.h 
// derived2's header 
#include "cParent.h" 
class cDerived2 : public cParent{ 
public: 
// I want access to derived1's pArr member over here....How do I do this ? 
+0

親クラスに共有コードをプッシュすることです。さもなければ、メソッドをpublicにするか、やっているような友人構文を使う –

+0

'pArr'がベースにある場合、ベースポインタを要求できませんか? –

答えて

0

これは、キーワードfriendが使用されているものです。これは、関数またはクラスのいずれかに使用できます。この場合は、クラスに適用します。あなたが保護されたメンバーにアクセスできる唯一の方法は、継承を通じてです。サブクラス、または友人クラスのいずれかである。クラス外のプライベートメンバーにアクセスする唯一の方法は、フレンド関数やクラスを使用することです。ここに関連リンクがありますcplusplus.com

友人クラスを宣言した例です。

friend class Derived1; // place in Derived2 

friend class Derived2; // place in Derived1 

派生1は、派生2人のプライベートメンバーへのアクセスを持っているでしょうし、派生1人のプライベートメンバーへのアクセスを持つことになり2派生:

class CSquare { 
    private: 
    int side; 
    public: 
    void set_side (int a) 
     {side=a;} 
    friend class CRectangle; // here is the friend declaration 
}; 

だからあなたの例では、あなたが使用することになります。

私はゲッター機能を使いたくないと思っています。それは友人と宣言されると

あなたが使用することができます。

Obj.theVar

の代わりに、次のようにゲッター機能を使用して:

Obj.getVar()

0

幼魚は、基底クラスであるので、あなたcDerived1の定義を必要とせずにこれを達成できます。 cDerived1のオブジェクトをcparentクラスのポインタとして渡すと、すべてが正常になります。ここにいくつかのサンプルコードがあります...

// cDerived2.h 
// derived2's header 
#include "cParent.h" 
class cDerived2 : public cParent{ 
public: 
// I want access to derived1's pArr member over here....How do I do this ? 
void AccessPArr(cparent* pParent) 
{ 
// access over here 
} 

int main() 
{ 
cDerived1 der1; 
cDerived2 der2; 

der2.AccessPArr(&der1); 
} 
関連する問題