0

私はいくつかのクラスを持っています。1 つのクラスは、それを必要とするすべての人に表示されるはずであり、残りはヘルパー クラス (一部は構造体) であり、プリンシパル クラスのみがアクセスできる必要があります。私はもともとこれをプリンシパル クラス内のネストされたクラスとして実装していましたが、ヘルパー クラスを追加するにつれて、ヘッダー ファイルが煩雑になり始めていました。そのため、ヘルパー クラスを別の名前空間に禁止された名前で配置しましたが、もっと良い方法があるのではないかと思います。匿名の名前空間を使用したいのですが、ヘッダーからヘルパー クラスを取り出すことができません。これは、プリンシパル クラスのメンバー変数として表示されるためです。

これは、現在ヘッダー ファイルに含まれている構成の簡略化されたバージョンで、インクルード ガードを除いたものです。

namespace __TopSecretVisibleNamespace {
    class Invisible{
    };
}

using namespace __TopSecretVisibleNamespace;
class Visible {
    public:
        Visible();
    private:
        Invisible sneaky;
};

何かご意見は?

4

1 に答える 1

0

文字通り「隠す」ことはできませんが、protected修飾子を使用して他のクラスからアクセスできないようにすることができます。何らかの理由ですべてのクラス メンバーで protected を使用したくない場合は、コンストラクターでのみ使用できます。その場合、非フレンド クラスは、パブリック クラスを含め、クラスのどのメンバーにもアクセスできません。

 class Invisible {
    friend class Visible;
    protected:
    Invisible() {
    }
    public:
    // though public, they cannot be called by classes other than Visible, because they can't instantiate the class.
    int Calc(int n)  
    {
        return n*n;
    }
    int i;  
};

class Visible {
    public:
    Visible(int i)
    {
        Invisible o;
        x=o.Calc(i);
    }
    int x;
};
于 2013-05-04T17:06:19.747 に答える