4

BruceEckelによるThinkinginC ++は参考書ではないことは知っていますが、奇妙な段落を見つけたので、それが今日でも適用できるかどうかわかりません。

構造をネストしても、プライベートメンバーへのアクセスが自動的に許可されるわけではありません。これを実現するには、特定の形式に従う必要があります。最初に、ネストされた構造を(定義せずに)宣言し、次にそれをフレンドとして宣言し、最後に構造を定義します。構造体の定義は、フレンド宣言とは別にする必要があります。そうしないと、コンパイラーによって非メンバーと見なされます。

ネストされた構造をフレンドとして宣言せずに実際にこれを試しましたが、機能しました。

struct myStruct{
private:
    int bar;
public:
    struct nestedStruct{
        void foo(myStruct *);
    }a;
};

void myStruct::nestedStruct::foo(myStruct * p){
    p->bar = 20;
}

基本クラスのプライベートメンバーを変更するために、ネストされた構造体のフレンドを宣言する必要がありますか?

4

1 に答える 1

9

その引用は間違っています。ネストされた内部クラスタイプはprivate、それを囲むクラスタイプのすべてのメンバー(を含む)にアクセスできます。

これはC++98には当てはまらず、お使いのエディションはおそらくそのバージョンの標準を参照しています。C++03およびC++11では、引用符は適用されません。

11.7ネストされたクラス[class.access.nest]

1ネストされたクラスはメンバーであるため、他のメンバーと同じアクセス権があります。囲んでいるクラスのメンバーは、ネストされたクラスのメンバーに特別にアクセスすることはできません。通常のアクセス規則(第11条)に従うものとします。

于 2012-10-12T23:31:30.913 に答える