La sobrecarga de operadores con plantillas en el interior de un BST

votos
0

Actualmente tengo una configuración de árbol binario de búsqueda, utilizando las plantillas que me permita cambiar fácilmente el tipo de datos dentro del árbol de búsqueda binaria. Por el momento, estoy teniendo problemas para sobrecargar la clase studentRecord que contiene los datos que se almacenan en el árbol. Necesito a la sobrecarga de los operadores de comparación dentro de esta clase, por lo que mi BST puede comparar adecuadamente dos objetos basado en una de sus contenidos (en este caso, el estudiante ID). Sin embargo, a pesar de la sobrecarga de los operadores dentro studentRecord, las comparaciones adecuadas todavía no están produciendo.

Detalles abajo:

Por el momento, el objeto studentTree BST ha sido creado, de tipo

bst<studentRecord *> studentTree;

studentRecord es la siguiente clase:

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

Cada vez que se agregan nuevos elementos a mi BST, deben ser comparados entre sí. Por lo tanto, quería sobrecargar la clase studentRecord, de modo que cuando se produce este proceso de comparación, los studentIDs se comparan (de lo contrario, se hará una comparación no válido).

Sin embargo, mi función de inserción nunca usa mis funciones de comparación sobrecargados. En cambio, parece que la comparación de los dos objetos de alguna otra manera, lo que resulta en la clasificación no válida dentro del BST. Parte de mi función de inserción está por debajo de - es importante tener en cuenta que tanto los datos nodePtr-> toInsert y deben ser de tipo studentRecord, debido a la occuring proceso de plantillas.

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

Además, aquí es una parte de la clase 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.....

¿Alguna idea sobre lo que puede estar causando esto? ¿Estoy sobrecargar la clase equivocada o la función mal? Cualquier ayuda se agradece - Me parece estar perderse ya que muchas cosas diferentes se están produciendo a la vez.

Publicado el 23/02/2011 a las 07:09
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
1

Su árbol es un árbol de punteros . Así que cuando se intenta insertar un elemento en el árbol de los valores de los punteros se compara. Por lo que su operador sobrecargado no se llama. Si desea utilizar el operador sobrecargado entonces usted debe crearbst<studentrecord>

Respondida el 23/02/2011 a las 07:14
fuente por usuario

votos
2

Se instancia la clase de plantilla de la siguiente manera:

bst<studentRecord *> studentTree;

Así bstType == * studentRecord

El inserto tiene este aspecto a continuación:

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

por lo que está haciendo una comparación puntero y es por eso que su operador no se llama como Asha allready señaló.

Más aún se sobrecarga sólo el operador mayor que (>), pero en el inserto se utiliza el operador menor que (<). Si usted realmente comparar dos objetos de tipo studentRecord en el código de inserción DEBERÍAMOS incluso compilar y debe quejan de que es incapaz de encontrar un lugar apropiado para menos de operador.

Más aún puedo señalar varios problemas en su código:

  1. studentRecord.studentID es de tipo cadena? Sin embargo intenta asignarle un número entero en el constructor. Esto simplemente convertir el número entero a char y asignar el carácter de la cadena - de modo muy probablemente no lo que pretende.
  2. Se echa en falta la menor de operador.

A continuación de código y un código thest demuestra que el operador se llama cuando se comparan dos instancias del tipo studentRecord. También se puede ver cuáles serían los efectos de la falta de menos de operador comentando la definición del operador en la clase studentRecord (- error> compilar).

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

Como comentario final, probablemente sería una buena idea para proporcionar los otros operadores de comparación también (> =, <=, == y! =.

Respondida el 23/02/2011 a las 10:29
fuente por usuario

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