Überladen von Operatoren mit Templates innerhalb eines BST

stimmen
0

Ich habe zur Zeit einen binären Suchbaum Setup-Vorlagen verwendet, ich zu erlauben, einfach die Art von Daten innerhalb des binären Suchbaumes zu ändern. Im Moment bin ich Probleme der studentRecord Klasse Überlastung, die die Daten enthält im Baum gespeichert werden. Ich brauche die Vergleichsoperator innerhalb dieser Klasse zu überlasten, so dass mein BST richtig zwei Objekte basierend auf einen ihrer Inhalte vergleichen (in diesem Fall den Studentenausweis). Doch trotz der Betreiber innerhalb studentRecord Überlastung, sind geeignete Vergleiche noch nicht auftreten.

Details unten:

Im Moment hat das bst Objekt studentTree erstellt wurde, vom Typ

bst<studentRecord *> studentTree;

studentRecord ist die folgende Klasse:

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

Jedes Mal, wenn neue Objekte zu meinem BST hinzugefügt werden, müssen sie miteinander verglichen werden. Daher wollte ich die studentRecord Klasse zu überlasten, so dass, wenn dieser Vergleich Prozess auftritt, werden die studentIDs verglichen (wie sonst, ein ungültiger Vergleich wird gemacht werden).

Jedoch nie verwendet meine Einfügefunktion meine überladenen Vergleichsfunktionen. Stattdessen scheint es, die beiden Objekte auf eine andere Weise zu vergleichen, innerhalb des BST in einem ungültigen Sortierung führt. Ein Teil meiner Insert-Funktion ist unten - es ist wichtig zu beachten, dass sowohl toInsert und nodePtr-> Daten vom Typ studentRecord sein sollte, aufgrund der Templat-Prozess auftritt.

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

Auch hier ist ein Teil der BST-Klasse defintion

// 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.....

Alle Ideen, was dieses verursachen kann? Bin Überlastung ich die falsche Klasse oder die falsche Funktion? Jede Hilfe ist willkommen - ich scheine da so viele verschiedene Dinge verloren gehen zu werden, werden auf einmal auftreten.

Veröffentlicht am 23/02/2011 um 07:09
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
1

Ihr Baum ist ein Baum von Zeigern . Also , wenn Sie versuchen , ein Element in den Baum eingefügt werden die Werte der Zeiger verglichen. So Ihr überladener Operator wird nicht aufgerufen. Wenn Sie den überladenen Operator verwenden möchten , dann sollten Sie erstellenbst<studentrecord>

Beantwortet am 23/02/2011 um 07:14
quelle vom benutzer

stimmen
2

Sie instanziiert Ihre Template-Klasse wie folgt aus:

bst<studentRecord *> studentTree;

So bstType == studentRecord *

Der Einsatz sieht wie folgt dann:

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

so Sie tun, um einen Zeiger Vergleich und aus diesem Grund Ihre Betreiber nicht genannt wird, als Asha allready hingewiesen.

Um so mehr überlasten Sie nur die größer ist als Operator (>), aber in Einsatz verwenden Sie die weniger als Operator (<). Wenn Sie wirklich zwei Objekte vom Typ studentRecord in Einsatz vergleichen würden should't des Code selbst kompiliert und soll darüber beschweren, dass sie nicht in der Lage ist, ein geeigneter weniger als Betreiber zu finden.

Um so mehr kann ich mehrere Probleme in Ihrem Code hinweisen:

  1. studentRecord.studentID ist vom Typ String? Allerdings versuchen Sie es für eine ganze Zahl im Konstruktor zuweisen. Dies wird konvertieren einfach die ganze Zahl verkohlen und das Zeichen der Zeichenfolge zuweisen - so ziemlich wahrscheinlich nicht, was Sie wollten.
  2. Sie vermissen die weniger als Operator.

Im Folgenden finden Sie Code und einige thest Code, der den Betreiber nachweist, aufgerufen wird, wenn zwei Instanzen des Typs studentRecord vergleichen. Sie können auch sehen, was wären die Auswirkungen der fehlenden weniger als Betreiber durch den Operator Definition in der studentRecord Klasse Kommentierung (-> kompilieren Fehler).

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

Als Ende Kommentar wahrscheinlich wäre es eine gute Idee, auch die anderen Vergleichsoperator zur Verfügung zu stellen (> =, <=, == und! =.

Beantwortet am 23/02/2011 um 10:29
quelle vom benutzer

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