gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:58:44 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

您可以通过将 Tree 类设为友元来允许 Tree 类访问其私有(private)对象:

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>>);
// ...
};
};

关于C++访问嵌套类的私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18318584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com