4

私は次の2つのクラスを持っています:

class A{
enum ee{a = 1, b = 2 , c = 3};
};

class B{
 /*


 */

};

クラスBで列挙型eeを使用したいのですが、クラスAで列挙型eeを友達にする方法は?\

4

3 に答える 3

3

このアプローチを使用して、より選択的にアクセスを制限できます。

class B;

class A {
    class inner {
        enum ee {a = 1, b = 2 , c = 3};
        friend class B;
    };
public:
    typedef inner exposed;
};

class B {
    void f() {
        const A::exposed::ee e(A::exposed::a);
    }
};

これにより、wrt アクセスをより具体的にしたい/必要な場合に、他のオプションよりも制限が導入されます。

具体的には、このアプローチAを使用するのに友達である必要はなく、指定したようBに宣言A::innerが制限されています。A::innerその後、その宣言をプライベートに保ち、フレンドシップ経由でアクセスできるようにします。クライアントは を宣言できますがinner( 経由でアクセスA::exposed)、列挙型と定数が非公開の場合、クライアントにとっては実用的ではありません。

于 2012-08-09T07:43:52.947 に答える
1

列挙型メンバーはそのスコープ内で公開されているため、列挙型を「フレンド」にすることはできません。「フレンドシップ」には、何かのプライベート メンバーを公開することが含まれます。したがって、この場合は友達になる必要がありますclass A

言い換えると:

class A {
    enum ee {a = 1, b = 2, c = 3};

    friend class B;
};

は、プライベートにenum A::eeからアクセスできるようにしclass Bます。

たとえば、次のようになります。

class B {
    void somefunc() {
        enum A::ee v = A::a;
    }
}
于 2012-08-09T07:33:53.953 に答える
1

列挙型を のパブリック セクションに配置するAと、それを として参照できA::ee、値をA::aA::b、およびとして参照できます。A::c.

class A
{
public:
   enum ee {a = 1, b = 2 , c = 3};
};

class B
{  
    A::ee an_enum;
    /*    */
}; 
于 2012-08-09T07:33:04.830 に答える