Χειριστής Η υπερφόρτωση με πρότυπα μέσα σε ένα BST

ψήφοι
0

Έχω σήμερα μια δυαδική ρύθμιση δένδρο αναζήτησης, χρησιμοποιώντας πρότυπα για να μου επιτρέψει να αλλάξετε εύκολα τον τύπο των δεδομένων στο πλαίσιο του δυαδικού δένδρου αναζήτησης. Αυτή τη στιγμή, είμαι έχοντας προβλήματα υπερφόρτωσης την κατηγορία studentRecord που περιέχει τα δεδομένα να αποθηκεύονται στο δέντρο. Θα πρέπει να επιβαρύνει τους τελεστές σύγκρισης σε αυτή την κατηγορία, έτσι ώστε BST μου να συγκρίνετε σωστά δύο αντικείμενα που βασίζεται σε ένα από τα περιεχόμενά τους (σε αυτή την περίπτωση, ο φοιτητής ID). Ωστόσο, παρά την υπερφόρτωση των φορέων εντός studentRecord, η σωστή σύγκριση εξακολουθούν να μην εμφανίζονται.

Λεπτομέρειες παρακάτω:

Προς το παρόν, η studentTree αντικείμενο BST έχει δημιουργηθεί, του τύπου

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, έτσι ώστε όταν συμβαίνει αυτή η διαδικασία σύγκρισης, οι studentIDs σύγκριση (όπως αλλιώς, μια μη έγκυρη σύγκριση θα γίνει).

Ωστόσο, η λειτουργία εισαγωγής μου ποτέ δεν χρησιμοποιεί υπερφορτωμένες λειτουργίες σύγκρισης μου. Αντ 'αυτού, φαίνεται να συγκρίνει τα δύο αντικείμενα κάποιο άλλο τρόπο, με αποτέλεσμα την μη έγκυρη διαλογή μέσα στο BST. Μέρος του ένθετου λειτουργίας μου είναι κάτω - είναι σημαντικό να σημειωθεί ότι τόσο toInsert και nodePtr-> δεδομένα πρέπει να είναι τύπου 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 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.....

Οποιεσδήποτε ιδέες για το τι μπορεί να προκαλεί αυτό; Είμαι υπερφόρτωση λάθος κατηγορία ή λάθος λειτουργία; Οποιαδήποτε βοήθεια είναι ευπρόσδεκτη - μου φαίνεται να χάνονται αφού είναι τόσα πολλά διαφορετικά πράγματα που συμβαίνουν ταυτόχρονα.

Δημοσιεύθηκε 23/02/2011 στις 07:09
πηγή χρήστη
Σε άλλες γλώσσες...                            


2 απαντήσεις

ψήφοι
1

Δέντρο σας είναι ένα δέντρο της δείκτες . Έτσι, όταν προσπαθείτε να εισαγάγετε ένα στοιχείο στο δέντρο οι τιμές των δεικτών συγκρίνεται. Έτσι υπερφορτωμένο χειριστή σας δεν λέγεται. Αν θέλετε να χρησιμοποιήσετε το υπερφορτωμένο χειριστή, στη συνέχεια, θα πρέπει να δημιουργήσετεbst<studentrecord>

Απαντήθηκε 23/02/2011 στις 07:14
πηγή χρήστη

ψήφοι
2

Μπορείτε υπόσταση σε τάξη το πρότυπό σας ως εξής:

bst<studentRecord *> studentTree;

Έτσι bstType == studentRecord *

Το ένθετο μοιάζει με αυτό στη συνέχεια:

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

έτσι ώστε να κάνουμε μια σύγκριση του δείκτη και αυτός είναι ο λόγος φορέας σας δεν είναι όπως ονομάζεται Asha allready τόνισε.

Περισσότερα ώστε να υπερφορτώνετε μόνο η μεγαλύτερη από χειριστή (>), αλλά στο ένθετο χρησιμοποιείτε το λιγότερο από χειριστή (<). Αν θα συγκρίνετε πραγματικά δύο αντικείμενα τύπου studentRecord στην Εισάγετε τον κωδικό should't ακόμη καταρτίσει και να διαμαρτύρονται ότι δεν είναι σε θέση να βρει το κατάλληλο λιγότερο από το χειριστή.

Περισσότερα γι 'αυτό να επισημάνω αρκετά προβλήματα στον κώδικά σας:

  1. studentRecord.studentID είναι τύπου string; Ωστόσο, μπορείτε να προσπαθήσετε να το εκχωρήσετε έναν ακέραιο στον κατασκευαστή. Αυτό θα μετατρέψει απλά το ακέραιο σε char και να εκχωρήσετε το χαρακτήρα της συμβολοσειράς - τόσο πολύ πιθανόν να μην είναι αυτό που προορίζεται.
  2. Σας λείπει το λιγότερο από το χειριστή.

Παρακάτω κωδικό σας και κάποιο κωδικό thest που δείχνει τον χειριστή παίρνει ονομάζεται κατά τη σύγκριση δύο περιπτώσεις τύπου studentRecord. Μπορείτε επίσης να δείτε ποια θα είναι τα αποτελέσματα της λείπει λιγότερο από χειριστή σχολιάζοντας τον ορισμό φορέα στην κατηγορία studentRecord (- σφάλμα> μεταγλώττιση).

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

Ως σχόλιο κατάληξη πιθανότατα θα ήταν μια καλή ιδέα να παρέχουν στους άλλους τελεστές σύγκρισης πάρα πολύ (> =, <=, == και! =.

Απαντήθηκε 23/02/2011 στις 10:29
πηγή χρήστη

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