工具函数实现需注意的问题

模板类

个人对模板类的实现方式比较生疏,所以在这里记录一下。

含有友元函数的模板类

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里的问题

许多编译器对模板类借口与实现分离的支持度比较低,所以建议采用合并的写法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值