class A {
public:
A();
int get();
void set();
};
protected int A::var;
それはうまくいくようです。ただし、「保護される前に修飾されていない ID が必要です」。これを行う正しい方法は何ですか?
コンパイラは、クラスのインスタンスに割り当てるスペースをどのように知るのでしょうか? 検討
A foo;
protected int A::var;
A bar;
var
コンパイラは、割り当て時にスペースを割り当てることをどのように認識しfoo
ますか? 1 行目と 2 行目の翻訳単位が異なる場合もあります。
いいえ、それは意味がないので不可能です。
簡単に言えば、いいえ、それは不可能です。
protected
複雑な言葉で言えば、標準ではキーワードとアクセス指定子をクラス定義内でのみ使用できるため、これは不可能です。
(他の人が言ったように)あなたが望むことを正確に行う方法はありませんが、クラスのユーザーにprotected
/private
メンバーを明らかにしたくない場合は、これに「ハック」があります。PrivateBase
andクラスを作成してからPublicBase
、前の 2 つのクラスの多重継承または構成を使用する 3 番目のクラスを作成できます。通常、これは、ヘッダー ファイルを配布したいが、すべてのプライベート メンバーを明らかにしたくないために行われます。
これがその例です。Scott Meyers も彼の本の 1 つに例を挙げていると思います。それはより多くの作業であり、あなたの側でのメンテナンスをより複雑にするので、それを覚えておいてください.