Opérateur Surcharger avec des modèles à l'intérieur d'un BST

voix
0

J'ai actuellement une configuration d'arbre de recherche binaire, en utilisant des modèles pour me permettre de changer facilement le type de données dans l'arbre de recherche binaire. En ce moment, je vais avoir du mal à surcharger la classe studentRecord qui contient les données à stocker dans l'arborescence. Je dois surcharger les opérateurs de comparaison au sein de cette classe, de sorte que mon BST peut bien comparer deux objets en fonction de l'un de leur contenu (dans ce cas, l'étudiant). Cependant, en dépit de la surcharge des opérateurs au sein studentRecord, les comparaisons appropriées sont encore ne se produisent pas.

Détails ci-dessous:

À l'heure actuelle, l'objet studentTree bst a été créé, de type

bst<studentRecord *> studentTree;

studentRecord est la classe suivante:

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

Chaque fois que de nouveaux éléments sont ajoutés à mon BST, ils doivent être comparés entre eux. Par conséquent, je voulais surcharger la classe studentRecord, de sorte que lorsque ce processus de comparaison se produit, les studentIDs sont comparés (sinon, une comparaison non valide sera).

Cependant, ma fonction d'insertion utilise jamais mes fonctions de comparaison surchargées. Il semble plutôt être de comparer les deux objets d'une autre manière, ce qui invalide le tri dans le BST. Une partie de ma fonction d'insertion est inférieure à - il est important de noter que les deux toInsert et nodePtr-> données doivent être de type studentRecord, en raison du processus de templating survenant.

// 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 plus, voici une partie de la classe BST défintion

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

Toutes les idées sur ce qui pourrait être la cause? Suis-je SURCHARGE la mauvaise classe ou la mauvaise fonction? Toute aide est appréciée - je semble se perdre puisque tant de choses différentes se produisent à la fois.

Créé 23/02/2011 à 07:09
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
1

Votre arbre est un arbre de pointeurs . Ainsi , lorsque vous essayez d'insérer un élément dans l'arbre les valeurs des pointeurs est comparé. Ainsi , votre opérateur surchargé est pas appelé. Si vous voulez utiliser l'opérateur surchargé vous devez créerbst<studentrecord>

Créé 23/02/2011 à 07:14
source utilisateur

voix
2

Vous instancier votre classe de modèle comme celui-ci:

bst<studentRecord *> studentTree;

Alors bstType == studentRecord *

L'insert ressemble à ceci alors:

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

de sorte que vous faites une comparaison de pointeur et c'est la raison pour laquelle votre opérateur n'est pas appelé comme Asha a allready dehors.

Plus si vous surchargez que l'opérateur supérieur à (>) mais insert vous utilisez moins que l'opérateur (<). Si vous voulez vraiment comparer deux objets de type studentRecord en insérer le code should't même compiler et devrait se plaindre qu'il ne peut pas trouver un approprié moins opérateur.

Plus que je puisse signaler plusieurs problèmes dans votre code:

  1. studentRecord.studentID est de type chaîne? Cependant, vous essayez de lui attribuer un nombre entier dans le constructeur. Ce sera tout simplement convertir l'entier en char et attribuer le caractère à la chaîne - donc probablement pas tout à fait ce que vous vouliez.
  2. Il vous manque moins que l'opérateur.

Ci-dessous vous code et un code de thest qui démontre l'opérateur est appelé lorsque l'on compare deux instances de type studentRecord. Vous pouvez également voir quels seraient les effets des disparus moins que l'opérateur en commentant la définition de l'opérateur dans la classe studentRecord (-> erreur de compilation).

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

En tant que commentaire de fin sans doute que ce serait une bonne idée de fournir aux autres opérateurs de comparaison trop (> =, <=, == et! =.

Créé 23/02/2011 à 10:29
source utilisateur

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