2016-06-14 15 views
0

私はこれが簡単なはずだと思いますが、私はまだ正しく動作することはできません。親クラスの変数へのアクセス

ここでは何がベストプラクティスであるかわかりません。最初に、子クラスに渡された変数を参照として格納し、それを子クラス内で呼び出しようとすることから始めました。ただし、変数が親クラス内で変更された場合、子は変更を認識しません。

子:

class Child 
{ 
public: 
    Child(bool &EndLoop); 
    ~Child(); 

private: 
    bool EndLoopRef; 
}; 

Child::Child (bool &EndLoop) : EndLoopRef(EndLoop) 
{ 
} 

Child::PrimaryFunction() 
{ 
    while (!Child::EndLoopRef) 
    { 
     // Main app function is in here 
    } 

    // EndLoop is true, we can now leave this method 
} 

親:これを要約すると

class Parent 
{ 
public: 
    Parent(); 
    ~Parent(); 

private: 
    bool EndLoop; 
}; 

Parent::Parent() 
{ 
    Child childclass(EndLoop); 
    childclass.PrimaryFunction(); 

    // EndLoop was changed and the loop is now overe 
} 

、親クラスを参照することによりEndLoopを渡します。子クラスはこの参照を格納し、EndLoopRefの真の値がループを終了するのを待ちます。言うまでもなく、それはループを終了していません。

FYIのEndLoop値は、親クラスのシステムコールによって変更されます。

+0

プライベートパーツは直接クラスでのみアクセスできます。親戚ではない。子がアクセスできる基本クラスに* protected *変数があります。最初に、あなたが本当にあなたの部分に干渉して子供を欲しい場合は、まず考えてみてください。 –

+0

また、親はコンパイル時に何人の子供も名前(または部分)が存在しないか分からないので、親は子の部分を混乱させることはできません。 –

+0

ChildクラスのEndLoopRef変数は参照ではありません。あなたがそれを参考にした場合。子クラスは変数のスコープを制御しないので注意が必要な場合があります。子クラスが使用される前に、制御クラスが有効範囲外になると問題が発生する可能性があります。 – Dan

答えて

3

クラスメンバbool EndLoopRef;の名前を付けても参照されません。これはまだちょうどboolの値であり、コンストラクタのメンバ初期化は構築時にEndLoopの値をロードします。

&を使用して参照を定義する方法を既に理解しています。

+0

ありがとうございます。なぜ私はそれを通常の値として定義したのか分かりません。それを指摘してくれてありがとう。 – user0000001

-3

プライベート変数を参照渡ししないでください。プライベートと対話する最も良い方法は、メンバ変数を持つクラスにget()およびset()メソッドを持たせることです。この場合、親の値はブール値を返すgetEndLoop()関数を提供できます。

Child::PrimaryFunction() 
{ 
    while (!Parent.getEndLoop()) 
    { 
     // Main app function is in here 
    } 

    // EndLoop is true, we can now leave this method 
} 
+0

なぜですか?プライベート変数を参照渡しすることには何も問題はありません。 – SergeyA

1

あなたはそれを参照として定義していません。 あなたは言う必要があります:

bool &EndLoopRef; 
関連する問題