在 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 略有改进,因为它会证明 Node
与 BST
.
的接近程度
然而,这并不理想,因为Node
仍然暴露在BST
的外面。这是 sub-optimal,因为实现细节在 class 之外是可见的。更好的方法是将 Node
在 BST
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
. 相反
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 略有改进,因为它会证明 Node
与 BST
.
然而,这并不理想,因为Node
仍然暴露在BST
的外面。这是 sub-optimal,因为实现细节在 class 之外是可见的。更好的方法是将 Node
在 BST
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
. 相反