C++访问嵌套类的私有成员
C++ Access private member of nested class
标题可能有点误导。我有以下问题:我有一个由叶子和内部节点组成的树。用户应该能够在叶子中存储任何信息和树有一些方法可以获得一组用户定义的值,并且需要在恒定时间内访问相应的叶子(不摊销)。
我提出了以下想法,但它不起作用,因为不幸的是,我无法访问嵌套类的私有成员:用户创建树,还为每个叶创建一个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
声明为friend
到UserElement<>
,这将允许Tree
访问UserElement<>
的所有成员。
- 这是关于成员访问规则的正确摘要吗
- 为什么我在空指针错误(链表)中获取成员访问权限
- 成员访问是否在空指针上定义C++?
- C++ IDE 不会推断/自动完成对模板类中的 std::array 下标表达式的成员访问
- 为什么类成员数据必须是静态的才能被模板化类的模板化结构成员访问
- 为什么c++允许成员函数定义中实例的私有成员访问
- C/C++ 包含点的宏参数(成员访问运算符)
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 如何将超类的受保护成员访问到其派生类. 如果已在派生类中声明了具有相同名称的函数?
- 内部类私有成员访问和封闭的友好性
- 通过 C++ 中的另一个结构成员访问结构
- 具体化 PRVALUES 成员访问的 decltype 行为不正确
- 常量表达式中的静态成员访问
- XVALUE来自类成员访问表达式
- 未经授权的私有类成员访问会产生编译时错误而不是运行时错误?
- 在 c++ 中,为什么 -> 被称为二进制中缀指针成员访问运算符?
- 如何访问模板参数的成员?“成员访问不完整的类型”
- 不明确的可变参数类成员访问
- C 受保护的成员访问
- 将typeID转换为静态成员访问(C )的命名空间