Operator Supraîncărcarea cu șabloane în interiorul unui BST

voturi
0

Am în prezent o configurare binar de căutare copac, folosind template-uri pentru a-mi permite să schimba cu ușurință tipul de date în arborele binar de căutare. În momentul de față, am probleme în a supraîncărca clasa studentRecord care conține datele care urmează să fie stocate în copac. Trebuie să supraîncărca operatorii de comparatie in cadrul acestei clase, astfel încât BST mea poate compara în mod corespunzător două obiecte pe baza unuia dintre conținutul lor (în acest caz, studentul ID-ul). Cu toate acestea, în ciuda supraincarcarea operatorilor din cadrul studentRecord, comparații adecvate sunt încă nu apar.

Detalii mai jos:

În momentul de față, a fost creat studentTree obiectul BST, de tip

bst<studentRecord *> studentTree;

studentRecord este următoarea clasă:

// 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;
};

Ori de câte ori elemente noi sunt adăugate la BST mea, acestea trebuie să fie comparate între ele. Prin urmare, am vrut să supraîncarce clasa studentRecord, astfel încât atunci când acest proces are loc comparație, studentIDs sunt comparate (altfel, o comparație nevalidă se va face).

Cu toate acestea, funcția mea de inserare nu utilizează funcțiile mele de comparație supraîncărcat. In schimb, se pare a fi compararea celor două obiecte alt mod, rezultând în sortarea invalidă în BST. O parte din funcția mea de inserție se află mai jos - este important de remarcat faptul că atât toInsert și nodePtr-> date ar trebui să fie de tip studentRecord, ca urmare a procesului de templateuri care au loc.

// 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);
    }

De asemenea, aici este o parte din clasa defintion 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.....

Orice idei cu privire la ceea ce ar putea fi cauza asta? Sunt supraîncărcării clasa greșită sau funcția greșită? Orice ajutor este apreciat - mi se pare că am pierdut, deoarece atât de multe lucruri diferite, au loc în același timp.

Întrebat 23/02/2011 la 07:09
sursa de către utilizator
În alte limbi...                            


2 răspunsuri

voturi
1

Copac este un copac de indicii . Deci , atunci când încercați să inserați un element în copac valorile pointerii se compară. Deci , operatorul supraîncărcat nu este numit. Dacă doriți să utilizați operatorul supraîncărcat , atunci ar trebui să creațibst<studentrecord>

Publicat 23/02/2011 la 07:14
sursa de către utilizator

voturi
2

Tu instantia clasa șablon astfel:

bst<studentRecord *> studentTree;

Deci , bstType == studentRecord *

Inserția arata ca acest lucru, atunci:

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

astfel încât să faci o comparație pointer și acesta este motivul pentru care operatorul nu este numit ca Asha a subliniat allready afară.

Mai mult, astfel încât să supraîncărcați numai mai mare decât operatorul (>), dar în insert utilizați mai puțin decât operatorul (<). Dacă v-ar compara într-adevăr două obiecte de tip studentRecord în inserați codul should't chiar compila și ar trebui să se plâng că nu este în măsură să găsească un caz mai mică decât operatorul.

Mai mult, așa că am putea sublinia mai multe probleme în codul:

  1. studentRecord.studentID este de tip string? Cu toate acestea încercați să-l atribuie un număr întreg în constructor. Acest lucru se va transforma pur și simplu întreg la char și atribuie caracterul din șirul - deci destul de probabil, nu ați intenționat.
  2. Vă lipsește mai puțin decât operatorul.

Mai jos codul dvs. și un cod thest care demonstrează operatorul se numește atunci când se compară două instanțe de tip studentRecord. Puteti vedea, de asemenea, ceea ce ar fi efectele lipsesc mai puțin decât operatorul comentând definiția operatorului din clasa studentRecord (- eroare> compilare).

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;
    }
}

Ca un comentariu final, probabil că ar fi o idee bună pentru a oferi celorlalți operatori de comparare prea (> =, <=, == și! =.

Publicat 23/02/2011 la 10:29
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more