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

时间:2013-08-19 16:24:52

标签: c++ class class-visibility

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

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

UserElement

3 个答案:

答案 0 :(得分:9)

从技术上讲,这是一个嵌套类(在另一个类中声明),而不是子类(继承自其超类)。

您可以允许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>>);
        // ...
    };
};

答案 1 :(得分:0)

你可以做

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

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

答案 2 :(得分:0)

您可以将class Tree friend声明为UserElement<>,这样Tree即可UserElement<>访问{{1}}的所有成员。