运算符使用BST内的模板进行重载

时间:2011-02-23 06:09:22

标签: c++ templates operator-overloading binary-tree binary-search-tree

我目前有一个二叉搜索树设置,利用模板可以轻松更改二叉搜索树中的数据类型。目前,我在重载studentRecord类时遇到问题,该类包含要存储在树中的数据。我需要重载此类中的比较运算符,以便我的BST可以根据其中一个内容(在本例中为学生ID)正确比较两个对象。然而,尽管studentRecord中的操作员超载,但仍未进行适当的比较。

以下详细信息:

目前,已创建bst对象studentTree,类型为

bst<studentRecord *> studentTree;

studentRecord是以下课程:

// studentRecord class
class studentRecord{
public:
    // standard constructors and destructors
    studentRecord(int studentID, string lastName, string firstName, string academicYear){ // constructor
        this->studentID=studentID;
        this->lastName=lastName;
        this->firstName=firstName;
        this->academicYear=academicYear;
    }

    friend bool operator > (studentRecord &record1, studentRecord &record2){
        if (record1.studentID > record2.studentID)
            cout << "Greater!" << endl;
        else
            cout << "Less then!" << endl;
        return (record1.studentID > record2.studentID);
    }

private:
    // student information
    string studentID;
    string lastName;
    string firstName;
    string academicYear;
};

每当新项目添加到我的BST时,必须将它们相互比较。因此,我想重载studentRecord类,以便在进行此比较过程时,比较studentID(否则,将进行无效比较)。

但是,我的插入函数从不使用我的重载比较函数。相反,它似乎是以其他方式比较这两个对象,导致BST内的无效排序。我的插入函数的一部分如下 - 重要的是要注意,由于模板化过程的发生,toInsert和nodePtr-&gt;数据都应该是studentRecord类型。

// insert (private recursive function)
template<typename bstType>
void bst<bstType>::insert(bstType & toInsert, bstNodePtr & nodePtr){
    // check to see if the nodePtr is null, if it is, we've found our insertion point (base case)
    if (nodePtr == NULL){
        nodePtr = new bst<bstType>::bstNode(toInsert);
    }

    // else, we are going to need to keep searching (recursive case)
    // we perform this operation recursively, to allow for rotations (if AVL tree support is enabled)
    // check for left
    else if (toInsert < (nodePtr->data)){ // go to the left (item is smaller)
        // perform recursive insert
        insert(toInsert,nodePtr->left);

        // AVL tree sorting
        if(getNodeHeight(nodePtr->left) - getNodeHeight(nodePtr->right) == 2 && AVLEnabled)
            if (toInsert < nodePtr->left->data)
                rotateWithLeftChild(nodePtr);
            else
                doubleRotateWithLeftChild(nodePtr);
    }

此外,这是BST类定义的一部分

// BST class w/ templates
template <typename bstType>
class bst{

private: // private data members

    // BST node structure (inline class)
    class bstNode{
    public: // public components in bstNode

        // data members
        bstType data;
        bstNode* left;
        bstNode* right;

        // balancing information
        int height;

        // constructor
        bstNode(bstType item){
            left = NULL;
            right = NULL;
            data = item;
            height = 0;
        }

        // destructor
        // no special destructor is required for bstNode     
    };

    // BST node pointer
    typedef bstNode* bstNodePtr;

public: // public functions.....

关于可能导致此问题的任何想法?我是在重载错误的类还是错误的函数?感谢任何帮助 - 我似乎迷失了,因为很多不同的事情同时发生。

2 个答案:

答案 0 :(得分:2)

您可以像这样实例化模板类:

bst<studentRecord *> studentTree;

所以 bstType == studentRecord *

插入看起来像这样:

template<studentRecord*>
void bst<studentRecord*>::insert(studentRecord*& toInsert, bst<studentRecord*>::bstNodePtr & nodePtr);

所以你正在做一个指针比较,这就是为什么你的操作符没有像Asha所指出的那样被调用。

更多,所以你只重载大于运算符(&gt;),但在插入中你使用小于运算符(&lt;)。如果你真的比较了insertRecord类型的两个对象,那么代码甚至不应该编译,并且应该抱怨它找不到合适的小于运算符。

更多我可以在您的代码中指出几个问题:

  1. studentRecord.studentID是字符串类型?但是,您尝试在构造函数中为其分配一个整数。这将简单地将整数转换为char并将字符分配给字符串 - 所以很可能不是你想要的。
  2. 您缺少小于运营商。
  3. 下面是代码和一些代码,用于演示在比较studentRecord类型的两个实例时调用运算符。您还可以通过在studentRecord类中注释运算符定义来查看缺少小于运算符的效果( - &gt;编译错误)。

    class studentRecord
    {
    public:
    
        studentRecord(int studentID) : studentID(studentID)
        { 
        }
    
        bool operator > (studentRecord &record)
        {
            return (studentID > record.studentID);
        }
    
        /* Uncomment to get rid of the compile error!
        bool operator < (studentRecord &record)
        {
            return studentID < record.studentID;
        }
        */
    
    private:
        // student information
        int studentID;
    };
    
    int main()
    {
        studentRecord r1(10);
        studentRecord r2(5);
    
        if ( r1 < r2 )
        {
            cout << "It works! " << "r1 less than r2" << endl;
        }
        else
        {
            cout << "It works! " << "r1 greater than r2" << endl;
        }
    
        if ( r1 > r2 )
        {
            cout << "It works! " << "r1 greater than r2" << endl;
        }
        else
        {
            cout << "It works! " << "r1 less than r2" << endl;
        }
    }
    

    作为结束评论,提供其他比较运算符也是一个好主意(&gt; =,&lt; =,==和!=。

答案 1 :(得分:1)

您的树是指针树。因此,当您尝试将一个元素插入树中时,会比较指针的值。因此,不会调用重载的运算符。如果要使用重载运算符,则应创建bst<studentrecord>