类c ++错误

时间:2014-02-18 14:07:24

标签: c++ class inheritance

我有一个问题,我有那些类,现在有效,因为我公开了属性,但是如果我把它私有,或者保护并继承到第二类,它就不起作用了,怎么样我可以做吗? 我需要尊重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);
};

有头文件: https://www.dropbox.com/s/s8xsn3q01ysyy4f/classi.h

你能告诉我怎么做吗? 谢谢, 再见

2 个答案:

答案 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是用户应该能够完全无知的东西。这并不意味着我们需要(试图)剥夺他们对它的了解,如果他们想要它,但他们通常不应该有任何真正的理由知道或关心它。