在 class 中和 class 之外定义节点

Defining a Node in a class and outside of class

Header-File-1 和 Header-File-2 之间的差异如何影响程序(用 C++ 编写)?

哪一个是更好的编码实践?

提前感谢您的回复。

头文件-1

#ifndef BST 
#define BST

#include<cstdlib>

class BST{

struct Node{

    DataType dataIn;
    Node * rigth;
    Node * left;
};
     public:
         BST();
        ~BST();
         Node * insert(DataType dataIn);
         Node * remove(DataType dataOut);
         Node * search(DataType dataSearch);
         void printTree();
     private:
         Node * root;
} 
#endif

头文件 2

#ifndef BST 
#define BST

#include<cstdlib>

struct Node{

    DataType dataIn;
    Node * rigth;
    Node * left;
};

class BST{
     public:
         BST();
        ~BST();
         Node * insert(DataType dataIn);
         Node * remove(DataType dataOut);
         Node * search(DataType dataSearch);
         void printTree();
     private:
         Node * root;
} 
#endif

第一个 header struct Node 是私有的 class,而第二个 header 是 public top-level struct.

这意味着第一个 header 的 Node 没有用:如果你要写这样的东西

BST::Node *n = bst.search(nullptr, DataType());

代码无法编译:

error: struct BST::Node is private within this context

制作struct Node public 可以解决这个问题。这将比第二个 header 略有改进,因为它会证明 NodeBST.

的接近程度

然而,这并不理想,因为Node仍然暴露在BST的外面。这是 sub-optimal,因为实现细节在 class 之外是可见的。更好的方法是将 NodeBST class 中设为私有,并更改 API,使 Node 永远不会从外部访问BST。这可以通过使用 BST class.

root 实例变量来实现

如果你的程序只使用一种树(在你的例子中:BST)那么这两种情况都是一样的;在 class BST 内部或外部声明它并使用遏制。

  • 如果您的程序处理不同种类的树,那么您应该在 BST 之外将其声明为 re-usable 例如:

    struct Node{
        DataType dataIn;
        Node * rigth;
        Node * left;
    };
    
    class rootedBT {
        public:
    
        private:
           Node* R;
           Node* L;
           T data;
    };
    
    class fullBT {
        public:
    
        private:
           Node* R;
           Node* L;
           T data;
     };
    
  • 还在headers中使用using namespace std真是太可怕了

  • class 的成员数据默认为 private,因此您的 class Node 默认是私有的,与 struct.
  • 相反