2016-07-21 13 views
3

これは私のcodeの「シミュレーション」です。"親"保護されたメンバーにはどのようにアクセスできますか?

#include <string> 
#include <iostream> 

using namespace std; 

class A 
{ 
protected: 
    int test = 10; 
}; 

class C; 

class B : public A 
{ 
private: 
    C *c; 

public: 
    B(); 

}; 

class C 
{ 
public: 
    C(B *b) { 
     cout << b->test; 
    } 
}; 

B::B() { 
    c = new C(this); 
} 

int main() 
{ 
    B(); 
} 

他のフレームワークからですので、私は、そのtest変数のprotectedステータスタイプに触れることができないと私は本当の「アクセス」を持っていません。

私はそれにBを渡し、(Aを拡張)BからクラスCのインスタンスを作成する必要が

とA.

のPARAM testへ(C)からのアクセスを行うためのファンシーな方法があります? B内で問題なくテストを使用できます。

+3

は 'INT getTest()を追加し、 'B' 'に{戻り試験を}。 – user463035818

+2

gettersとsetterが嫌いなので、 'A'メンバへの参照を返す' B'のpublic getterを定義することができます。 – NathanOliver

答えて

5

CクラスはBから継承されないため、Bは親ではないため、Cクラスは保護されたメンバーにアクセスできません。あなたはBとCを制御するが、他のフレームワークから来た触れることが許されていない場合

回避策

、あなたが試みることができる:

class B : public A 
{ 
private: 
    C *c; 

public: 
    B(); 
friend C; // Make C a friend of B so that it has access. 
}; 

Online demo

アドバイス

あなたが望むものを達成するための技術的な回避策は、そうすることはお勧めできません。保護されたメンバーのアイデアは、派生クラスにのみ関連する実装の詳細です。友情でそれを開くと、あなたはアクセスが必要とされない実装の詳細への依存関係を作成します。したがって、フレームワークの設計原則に違反します。可能ですが、あなた自身の責任で行ってください。

もう1つのアプローチは、Bの保護された要素にパブリックゲッターを追加し、次にCでこのパブリックメンバー(demo)を参照することです。それは良いですが、あなたはまだあなたが想定していないデータを公開するでしょう。

+1

多くのありがとうございました!クリア! – markzzz

3

また、Bにおける公衆アクセサを追加することができる:

class B : public A 
{ 
private: 
    C *c; 

public: 
    B(); 
    int get_test() const { return this->test; } 
}; 
関連する問題