2016-05-03 10 views
-3

基本クラスのプライベートメンバー変数を派生クラスのコンストラクタの値に設定する方法はありますか?プライベート基本クラスメンバ変数を派生クラスで変更できますか?

getterとsetterの方法が何であるか、変数protectedまたはpublicを使用していることは理解していますが、基本クラスを変更できないと仮定して設定する方法はありますか?

+1

なぜこれが欲しいですか? – GManNickG

+0

基本クラスを制御できない場合は、本当に悪い考えです。あなたは未定義の動作を今作成していなくても、将来の予測不可能な時間に壊れたコードのために自分自身を設定しています。 – Galik

+0

_ "しかし、基本クラスを変更できないと仮定して、それを設定する別の方法はありますか?" _通常はありませんが、基本クラスはprivateメンバー変数を初期化するコンストラクタを提供しますか? –

答えて

5

いいえ、それはプライベートです。それはprivateの全体のポイントです。

コメント内の説明から、ベースクラスはコンストラクタを使用してそれを行う方法を提供していますので、それを使用できます。

// Assuming MyBaseclass has a 1 int constructor to set the 
// private member, then something like this works. 
// 
MySubclass(int x) : MyBaseclass(x) {} 
+0

答えは[より簡単に]判明しました(http://stackoverflow.com/questions/36994671/can-a-private-base-class-member-variable-be-modified-in-a-derived-class#comment61543368_36994671)しかし、質問は1位で悪いです。 –

-1

いいえできません。ただし、派生クラスを基本クラスのfriend(この場合はあまり意味がない)またはのいずれかにすると、privateメンバはprotectedメンバ(これは基本クラスと派生クラスからのみアクセス可能です)にすることができます。

派生クラスにすべてprivateメンバーを与えることを避けるため、この場合は2番目の提案をお勧めします。しかし、通常の場合は、インターフェイスを介して基本クラスにアクセスする必要がありますが、実際にはデザインによって異なります。

編集:それがコンストラクタ内にある場合は、処理が異なる必要があります。他の答えを見てください。

+0

答えは[より簡単に]判明しました(http://stackoverflow.com/questions/36994671/can-a-private-base-class-member-variable-be-modified-in-a-derived-class#comment61543368_36994671)しかし、質問は1位で悪いです。 –

0

getterとsetterの方法が何であり、どのような変数をprotectedまたはpublicにするのかは分かりますが、基本クラスを変更できないとすれば、それを設定する方法はありますか?

確かに。派生クラスのコンストラクタ本体でsetter関数を使用する代わりに、派生クラスの適切なコンストラクタを使用して基本クラスの初期化コンストラクタを呼び出します(commentに存在するとします)。

class Base { 
public: 
    Base(int x, int y) : x_(x), y_(y) {} 
private: 
    int x_; 
    int y_; 
}; 

class Derived : public Base { 
public: 
    Derived() : Base(15,42) {} 
      // ^^^^^^^^^^^^^ 
}: 

member initializer listについてさらに詳しくをご覧ください。

関連する問題