8

タイトルは少し誤解を招くかもしれません。次の問題があります。葉と内部ノードで構成されるツリーがあります。ユーザーは葉に任意の情報を保存できる必要があり、ツリーにはユーザー定義の値のセットを取得し、対応する葉に一定時間 (償却されない) でアクセスする必要があるいくつかのメソッドがあります。

次のアイデアを思いつきましたが、残念ながらネストされたクラスのプライベートメンバーにアクセスできないため、機能しません。ユーザーはツリー作成し、リーフごとUserElementに、対応するリーフの user_defined 値を含むインスタンスを作成します。doSomethingWithTheTree(list>) のようなメソッドが呼び出されてツリーが構築されると、ツリーは対応するリーフを作成し、プライベート フィールドに保存しますleaf。ユーザーが user_defined 値に対応するいくつかのリーフを使用してメソッドを呼び出したいときはいつでも、対応するUserElements を指定してメソッドを呼び出すだけで、ツリーは対応するリーフを一定時間で取得できます。

class Tree {
    public:
        template <typename T>
        class UserElement {
            private:
                T user_value;
                tree_node* leaf; // this has to be private for
                                 // everyone outside the class `Tree`
            public:
                T getInf() {
                    return user_value;
                }
                void setInf(T i) {
                    user_value = i;
                }
        };

        void doSomethingWithTheTree(list<UserElement<T>> elements) {
            ...
            // I want to be able to access elem.leaf for all elements
        }
}
4

3 に答える 3

14

技術的には、これはネストされたクラス(別のクラス内で宣言されたもの) であり、サブクラス(スーパークラスから継承されたもの) ではありません。

Tree クラスをフレンドにすることで、そのプライベートにアクセスできるようにすることができます。

class UserElement {
    friend class Tree;
    // ...
};

または、カプセル化を改善するために、必要なメンバー関数のみへのアクセスを制限することもできますが、正しい順序で宣言する必要があるため、少し面倒になります。

class Tree {
public:
    // Declare this so we can declare the function
    template <typename T> class UserElement;

    // Declare this before defining `UserElement` so we can use it
    // in the friend declaration
    template <typename T>
    void doSomethingWithTheTree(list<UserElement<T>> elements) {
        elements.front().leaf;
    }

    template <typename T>
    class UserElement {
        // Finally, we can declare it a friend.
        friend void Tree::doSomethingWithTheTree<T>(list<UserElement<T>>);
        // ...
    };
};
于 2013-08-19T16:34:31.380 に答える
0

to を宣言class TreeするfriendUserElement<>、のすべてのメンバーTreeにアクセスできます。UserElement<>

于 2013-08-19T16:30:01.693 に答える