0
class A {
public:
    A();
    int get();
    void set();
};

protected int A::var;

それはうまくいくようです。ただし、「保護される前に修飾されていない ID が必要です」。これを行う正しい方法は何ですか?

4

3 に答える 3

6

コンパイラは、クラスのインスタンスに割り当てるスペースをどのように知るのでしょうか? 検討

A foo;
protected int A::var;
A bar;

varコンパイラは、割り当て時にスペースを割り当てることをどのように認識しfooますか? 1 行目と 2 行目の翻訳単位が異なる場合もあります。

いいえ、それは意味がないので不可能です。

于 2012-05-05T15:21:57.513 に答える
6

簡単に言えば、いいえ、それは不可能です。

protected複雑な言葉で言えば、標準ではキーワードとアクセス指定子をクラス定義内でのみ使用できるため、これは不可能です。

于 2012-05-05T15:18:58.453 に答える
0

(他の人が言ったように)あなたが望むことを正確に行う方法はありませんが、クラスのユーザーにprotected/privateメンバーを明らかにしたくない場合は、これに「ハック」があります。PrivateBaseandクラスを作成してからPublicBase、前の 2 つのクラスの多重継承または構成を使用する 3 番目のクラスを作成できます。通常、これは、ヘッダー ファイルを配布したいが、すべてのプライベート メンバーを明らかにしたくないために行われます。

これがその例です。Scott Meyers も彼の本の 1 つに例を挙げていると思います。それはより多くの作業であり、あなたの側でのメンテナンスをより複雑にするので、それを覚えておいてください.

于 2012-05-05T15:24:41.470 に答える