3

親クラスがあり、その親クラスから 2 つの公に派生したクラスがあります。例えば。

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

質問: ある派生クラスのプライベート メンバーに別の派生クラスからアクセスしたいと考えています。どうすればいいですか?

私が今持っている方法は次のとおりです: cDerived1 オブジェクトをパラメーターとして cDerived2 の ctor に渡します。このようにすると、cDerived2 を cDerived1 のフレンドとして宣言し、cDerived2.h 内に 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);  
}

これは正しい方法ですか、それとも私は非常に露骨に間違ったことをしていますか??

ありがとう。

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 ?
4

2 に答える 2

0

これがキーワードのfriend使用目的です。関数またはクラスのどちらにも使用できます...この場合、クラスに適用します。保護されたメンバーにアクセスできる唯一の方法は、継承によるものです...つまり、サブクラスまたはフレンドクラスです。クラス外のプライベート メンバーにアクセスする唯一の方法は、フレンド関数またはクラスを使用することだと確信しています。これはcplusplus.comからの関連リンクです

フレンド クラスを宣言する例 (2 番目) を次に示します。

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

したがって、あなたの例では次を使用します:

friend class Derived1; // place in Derived2 

friend class Derived2; // place in Derived1

派生 1 は派生 2 プライベート メンバーにアクセスでき、派生 2 は派生 1 プライベート メンバーにアクセスできます。

単にゲッター関数を使用したくないと仮定しています。

フレンドとして宣言されたら、次を使用できます。

Obj.theVar

次のような getter 関数を使用する代わりに:

Obj.getVar()

于 2012-02-13T22:33:34.260 に答える
0

Since pArr is in the base class, you can achieve this without needing the definition of cDerived1. Pass the object of cDerived1 as pointer of the cparent class and everything would be alright. Here is some sample code...

// 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);
}
于 2012-02-14T05:57:10.137 に答える