标题可能有点误导。我有以下问题:我有一棵由叶子和内部节点组成的树。用户应该能够在叶子中存储任何信息and该树有一些方法可以获取一组用户定义的值,并且需要在恒定时间内(未摊销)访问相应的叶子。
我提出了以下想法,但它不起作用,因为不幸的是我无法访问嵌套类的私有成员:用户创建树and也为每个叶子一个实例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
}
}
从技术上来说,这是一个嵌套类(在另一个类中声明),而不是subclass(从其超类继承)。
您可以通过将 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>>);
// ...
};
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)