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
答案 0 :(得分:1)
在第一个标题中struct Node
对于该类是私有的,而在第二个标题中,它是公共顶级struct
。
这意味着第一个标题的Node
是无用的:如果你要写这样的东西
BST::Node *n = bst.search(nullptr, DataType());
代码无法编译:
错误:
struct BST::Node
在此上下文中是私有的
公开struct Node
可以解决这个问题。这对第二个标题略有改进,因为它会显示Node
与BST
的接近程度。
但是,这并不理想,因为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
相反。