在班级和课外定义节点

Defining a Node in a class and outside of class

本文关键字:定义 节点      更新时间:2023-10-16

header-file-1和header-file-2之间的差异如何影响程序(用C 编写(?

哪一种是编码的更好练习?

感谢您提前的回复。

header-file-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

header-file-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

在第一个标题struct Node中是私人的,而在第二个标题中,它是公共顶级struct

这意味着第一个标题的Node是没有用的:如果您要写下类似的内容

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

代码不会编译:

错误:struct BST::Node在此上下文中是私有的

公开struct Node可以解决此问题。这将是第二个标头的略有改进,因为它将证明NodeBST的亲密关系。

但是,这不是理想的,因为Node仍暴露于BST的外部。这是次优的,因为实施细节可见班的外部。一种更好的方法是将NodeBST类中私有化,并以使NodeBST外部访问的方式更改API。这可以通过使用BST类的root实例变量来实现。

如果您的程序仅使用一种树(在您的情况下:BST(,则在两种情况下都是相同的;在BST类或外部声明并使用遏制。

  • 如果您的程序处理不同种类的树,则您应该在BST之外声明它,以重新使用:

    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;
     };
    
  • 也在标题中使用using namespace std确实是可怕的。

  • 类的成员数据默认情况下是private,因此默认情况下您的class Node是私有的,与struct相反。