我有一个问题,我有那些类,现在有效,因为我公开了属性,但是如果我把它私有,或者保护并继承到第二类,它就不起作用了,怎么样我可以做吗? 我需要尊重OOP规则
template <typename T>
class BinaryNode
{
public:
T key;
BinaryNode<T>* left;
BinaryNode<T>* right;
BinaryNode<T>* parent;
BinaryNode(){}
~BinaryNode(){}
};
And this:
template <typename T>
class BinarySearchTree
{
private:
BinaryNode<T>* root;
BinaryNode<T>* newNode(T key);
BinaryNode<T>* minimum(BinaryNode<T>* node);
BinaryNode<T>* maximum(BinaryNode<T>* node);
BinaryNode<T>* successor(BinaryNode<T>* node);
void insert(BinaryNode<T>** node, T key);
BinaryNode<T>* search(BinaryNode<T>* node, T key);
void distance(BinaryNode<T>* node, T key);
void inorderTreeWalk(BinaryNode<T>* node);
public:
BinarySearchTree();
~BinarySearchTree();
void insert(T key);
BinaryNode<T>* search(T key);
void distance(T key);
void inorderTreeWalk();
BinaryNode<T>* remove(BinaryNode<T>* node);
};
你能告诉我怎么做吗?
谢谢,
再见
答案 0 :(得分:0)
您可以将BinarySearchTree设为BinaryNode的朋友类。
template <typename T>
class BinarySearchTree; // forward declaration
template <typename T>
class BinaryNode {
friend class BinarySearchTree<T>; // we only allow BinarySearchTree with the same template T access
private:
// make everything you want private
}
这样BinarySearchTree就可以访问BinaryNode的私有字段。
请注意,您无需创建空的默认构造函数/析构函数。
以下几行不是必需的:
BinaryNode(){}
~BinaryNode(){}
When should you use 'friend' in C++?
[编辑:添加模板参数。有关其他可能性,请参阅Class template with template class friend, what's really going on here?
答案 1 :(得分:0)
由于BinaryNode
的基本思想通常仅在二叉树的上下文中有意义,因此通常首先将其定义嵌套在BinarySearchTree类中。
这具有使外部类成为内部的朋友的副作用,因此您可以将所有节点类的成员设为私有,并且树仍然可以访问它所需的任何内容。
就个人而言,我至少会更改其他一些内容,尽管它们与您提出的问题并不完全相关。例如,我将remove
更改为关键项而不是节点:
BinaryNode* remove(T key);
我可能还会将其更改为返回BinaryNode *
以外的内容。 IMO,BinaryNode
是用户应该能够完全无知的东西。这并不意味着我们需要(试图)剥夺他们对它的了解,如果他们想要它,但他们通常不应该有任何真正的理由知道或关心它。