40

3 つの C++ クラス FooA、FooB、および FooC があるとします。

FooA には という名前のメンバー関数がありHelloます。クラス FooB でこの関数を呼び出したいのですが、クラス FooC で呼び出せないようにします。これを実現するための最善の方法は、FooB を FooA のフレンド クラスとして宣言することです。しかし、私がこれを行う限り、FooA のすべての非公開および保護されたメンバーが公開され、これは私にはまったく受け入れられません。

friendしたがって、このジレンマを解決できるクラスよりも C++ (03 または 11) に優れたメカニズムがあるかどうかを知りたいです。

そして、次の構文が可能であればいいと思います:

class FooA
{
private friend class FooB:
    void Hello();
    void Hello2();
private:
    void Hello3();
    int m_iData;
};

class FooB
{
    void fun()
    {
        FooA objA;
        objA.Hello()  // right
        objA.Hello2() // right
        objA.Hello3() // compile error
        ojbA.m_iData = 0; // compile error
    }
};

class FooC
{
    void fun()
    {
        FooA objA;
        objA.Hello()  // compile error
        objA.Hello2() // compile error
        objA.Hello3() // compile error
        ojbA.m_iData = 0; // compile error
    }
};
4

8 に答える 8

1

最も安全な解決策は、2 つのクラスの 1 つを作成するのではなく、別のクラスを「仲介者」として使用するfriend.ことです。これを行う 1 つの方法は、@ForEveR による回答で提案されていますが、プロキシについて検索することもできます。適用できるクラスおよびその他の設計パターン。

于 2013-04-17T10:01:47.697 に答える