Operator Przeciążenie z szablonów wewnątrz BST

głosy
0

Obecnie mam binarne drzewo konfiguracji wyszukiwania, wykorzystując szablony pozwalają mi łatwo zmienić typ danych w wyszukiwaniu binarnym drzewie. W tej chwili mam problemy przeciążenia klasę studentRecord który zawiera dane mają być przechowywane w drzewie. Muszę przeciążać operatorów porównania w tej klasie, tak, że moja BST można właściwie porównać dwa obiekty na podstawie jednego z ich zawartością (w tym przypadku, student ID). Jednak pomimo przeciążania operatorów ciągu studentRecord, odpowiednie porównania są nadal nie występujące.

Szczegóły poniżej:

Na chwilę obecną studentTree BST obiekt został utworzony, typu

bst<studentRecord *> studentTree;

studentRecord jest następujące klasy:

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

Ilekroć nowe elementy są dodawane do mojego BST, muszą być ze sobą porównywane. Dlatego chciałem przeciążać klasę studentRecord, tak, że kiedy pojawia się ten proces porównania studentIDs porównywane są (jak inaczej, nieważne porównanie zostanie wykonane).

Jednak nie moja funkcja wstawiania wykorzystuje moje przeciążonych funkcji porównawczych. Zamiast tego wydaje się być porównanie dwóch obiektów w jakiś inny sposób, w wyniku nieprawidłowej segregacji w BST. Część mojej funkcji insert jest poniżej - ważne jest, aby pamiętać, że zarówno toInsert i nodePtr-> Dane powinny być typu studentRecord, ze względu na występujące procesowego szablonów.

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

Również tutaj jest część umowach definicja klasy 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.....

Wszelkie pomysły na to, co może być przyczyną? Ja przeciążenia niewłaściwą klasę lub niewłaściwą funkcję? Każda pomoc jest mile widziana - Wydaje mi się zgubić, ponieważ tak wiele różnych rzeczy występują jednocześnie.

Utwórz 23/02/2011 o 07:09
źródło użytkownik
W innych językach...                            


2 odpowiedzi

głosy
1

Drzewo jest drzewem wskaźników . Więc podczas próby wstawienia elementu do drzewa wartości tych wskaźników jest porównywany. Więc przeciążony operator nie jest tzw. Jeśli chcesz użyć przeciążony operator następnie należy utworzyćbst<studentrecord>

Odpowiedział 23/02/2011 o 07:14
źródło użytkownik

głosy
2

Ci zainicjować klasę szablonu tak:

bst<studentRecord *> studentTree;

Więc bstType == studentRecord *

Wkładka wygląda to wówczas:

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

tak robisz porównanie wskaźnika, a to dlatego operator nie nazywa się Asha allready zauważył.

Więcej więc przeciążyć tylko większa niż operator (>), ale w wkładką użyć mniej niż operatora (<). Jeśli chcesz naprawdę porównać dwa obiekty typu studentRecord w wstawić kod should't nawet skompilować i powinien narzekać, że jest w stanie znaleźć odpowiednią mniej niż operatora.

Więcej więc mogę wskazać kilka problemów w kodzie:

  1. studentRecord.studentID jest typu ciąg? Jednak próby przypisania mu całkowitą w konstruktorze. Będzie to po prostu przekonwertować liczbę całkowitą do char i przypisać znak z łańcucha - tak całkiem prawdopodobnie nie to, co zamierzałeś.
  2. Brakuje mniej niż operatora.

Poniżej kod i niektórych kodu test w który demonstruje operator pobiera nazywane przy porównywaniu dwóch wystąpień typu studentRecord. Można również zobaczyć, jakie byłyby skutki brakuje mniej niż operatora komentując definicję operatora w klasie studentRecord (- błędu> kompilacji).

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

Jako komentarzu końcowym prawdopodobnie byłby to dobry pomysł, aby zapewnić inne operatory porównania zbyt (> =, <=, == i! =.

Odpowiedział 23/02/2011 o 10:29
źródło użytkownik

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