在类

时间:2018-02-05 18:28:37

标签: c++ object-oriented-analysis

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

2 个答案:

答案 0 :(得分:1)

在第一个标题中struct Node对于该类是私有的,而在第二个标题中,它是公共顶级struct

这意味着第一个标题的Node是无用的:如果你要写这样的东西

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

代码无法编译:

  

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

公开struct Node可以解决这个问题。这对第二个标题略有改进,因为它会显示NodeBST的接近程度。

但是,这并不理想,因为Node仍然在BST的外部。这是次优的,因为实现细节对于类的外部是可见的。更好的方法是在Node类中将BST设为私有,并以从不Node之外访问BST的方式更改API。这可以通过使用root类的BST实例变量来实现。

答案 1 :(得分:0)

如果您的程序只使用一种树(在您的情况下: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相反。