C++访问嵌套类的私有成员

C++ Access private member of nested class

本文关键字:成员 访问 嵌套 C++      更新时间:2023-10-16

标题可能有点误导。我有以下问题:我有一个由叶子和内部节点组成的树。用户应该能够在叶子中存储任何信息树有一些方法可以获得一组用户定义的值,并且需要在恒定时间内访问相应的叶子(不摊销)。

我提出了以下想法,但它不起作用,因为不幸的是,我无法访问嵌套类的私有成员:用户创建树还为每个叶创建一个UserElement实例,其中包含相应叶的用户定义值。一旦调用了doSomethingWithTheTree(list>)这样的方法并构建了树,树就会创建相应的叶子并将其保存在私有字段leaf中。每当用户想要用与其用户定义值相对应的一些叶子来调用方法时,他/她只需要通过给出相应的UserElement s来调用该方法,树就可以在恒定时间内检索到相应的叶子。

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
        }
}

从技术上讲,这是一个嵌套类(在另一个类中声明),而不是子类

你可以让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>>);
        // ...
    };
};

您可以进行

class Outer {
   private: // maybe protected:
   class Inner {
      public:
      ....
   };
};

class Outer {
   public:
   class Inner {
      friend class Outer;
      private:
      ....
   };
};

您可以将class Tree声明为friendUserElement<>,这将允许Tree访问UserElement<>的所有成员。