模板类
个人对模板类的实现方式比较生疏,所以在这里记录一下。
含有友元函数的模板类
template <class T>
class BinaryTree
{
protected:
BinTreeNode<T> *root; //point to root
T RefValue; //flag of stop input information
void CreateBinTree(istream &in, BinTreeNode<T> *&subTree); //create a tree from a file
bool Insert(BinTreeNode<T> *&subTree, const T &x);
void Destory(BinTreeNode<T> *&subTree); //destory subTree
//bool Find(BinTreeNode<T> *subTree, const T &x) const; //find x
BinTreeNode<T> *Copy(BinTreeNode<T> *orignode); //duplicate
int Height(BinTreeNode<T> *subTree); //return height
int Size(BinTreeNode<T> *subTree); //return node number
BinTreeNode<T> *Parent(BinTreeNode<T> *subTree, BinTreeNode<T> *current);
BinTreeNode<T> *Find(BinTreeNode<T> *subTree, const T &x) const; //search x
void Traverse(BinTreeNode<T> *subTree, ostream &out); //preorder output
void preOrder(BinTreeNode<T> &subTree, void (*visit)(BinTreeNode<T> *p)); //preorder traversal
void inOrder(BinTreeNode<T> &subTree, void (*visit)(BinTreeNode<T> *p)); //inorder traversal
void postOrder(BinTreeNode<T> &Tree, void (*visit)(BinTreeNode<T> *p)); //postorder traversal
template<class Ty>
friend istream& operator >>(istream &in, BinaryTree<Ty> &Tree); //input load
template <class Ty>
friend ostream &operator<<(ostream &out, BinaryTree<Ty> &Tree); //output load
public:
BinaryTree():root(NULL){} //initialize
BinaryTree(T value):RefValue(value),root(NULL){}
BinaryTree(BinaryTree<T> &s); //copy constructor
~BinaryTree() { Destory(root); }
bool IsEmpty() { return (root == NULL) ? true: false; } //is empty?
BinTreeNode<T> *Parent(BinTreeNode<T> *current){ //return parent
return (root == NULL || root == current) ? NULL : Parent(root, current);
}
BinTreeNode<T> *LeftChild(BinTreeNode<T> *current){ //return left child
return (current != NULL) ? current->LNode : NULL;
}
BinTreeNode<T> *RightChild(BinTreeNode<T> *current){ //return right child
return (current != NULL) ? current->RNode : NULL;
}
int Height() { return Height(root); } //return height
int Size() { return Size(root); } //return nodes number
BinTreeNode<T> *getRoot() const { return root; } //return root
void preOrder(void (*visit)(BinTreeNode<T> *p)){ //preorder
preOrder(root, visit);
}
void inOrder(void (*visit)(BinTreeNode<T> *p)){ //inorder
inOrder(root, visit);
}
void postOrder(void (*visit)(BinTreeNode<T> *p)){ //postorder
postOrder(root, visit);
}
void levelOrder(void (*visit)(BinTreeNode<T> *p)); //levelorder
int Insert(const T item); //insert new element
BinTreeNode<T> * Find(T item) const; //search
};
友元函数的特殊写法
template 《class Ty》
friend istream& operator >>(istream &in, BinaryTree &Tree); //input load
template 《class Ty》
friend ostream &operator<<(ostream &out, BinaryTree &Tree); //output load
对于工具类存放的处理
友元函数的特殊写法
是放在一个cpp+一个h里,还是放在一个h里的问题
许多编译器对模板类借口与实现分离的支持度比较低,所以建议采用合并的写法