Operátor Přetížení se šablonami uvnitř BST

hlasů
0

I v současné době mají binární nastavení vyhledávací strom, s využitím šablon, aby mi snadno změnit typ dat v binárním vyhledávacím stromu. V současné době mám potíže přetížení třídu studentRecord, který obsahuje data, která mají být uloženy ve stromu. Musím přetížení operátorů porovnání v rámci této třídy, takže můj BST může správně porovnat dva objekty, založené na jednom z jejich obsah (v tomto případě student ID). Navzdory přetěžování operátorů v studentRecord, správné srovnání jsou stále nedochází.

Podrobnosti níže:

V tuto chvíli byl vytvořen BST objekt studentTree, typu

bst<studentRecord *> studentTree;

studentRecord je následující třída:

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

Kdykoli jsou nové položky přidány do mého BST, musí být ve srovnání s sebou. Proto jsem chtěl přetížení třídu studentRecord, tak, že když nastane toto srovnání proces se studentIDs se porovnávají (jinak, neplatný srovnání bude).

Nicméně, můj funkce vkládání nikdy využívá mé přetížené porovnávací funkce. Místo toho se zdá, že porovnávání dvou objektů jinudy, což má za následek neplatné třídění v BST. Část mé vložky funkce je nižší - to je důležité si uvědomit, že jak toInsert a nodePtr-> údaje by měly být typu studentRecord, vzhledem k šablon procesů vyskytující.

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

Také zde je část BST třídy 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.....

Jakékoli myšlenky na to, co může být příčinou? Jsem přetížení nesprávnou třídu nebo špatnou funkci? Jakákoliv pomoc je oceňována - Připadá mi, že se ztratí, protože tolik různých věcí, se vyskytují najednou.

Položena 23/02/2011 v 07:09
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
1

Váš strom je strom ukazatelů . Takže při pokusu o vložení prvku do stromu se hodnoty ukazatelů se v porovnání. Takže vaše přetížené operátor není volána. Chcete-li použít přetížené operátor, pak byste měli vytvořitbst<studentrecord>

Odpovězeno 23/02/2011 v 07:14
zdroj uživatelem

hlasů
2

Instanci třídu šablony takto:

bst<studentRecord *> studentTree;

Takže bstType == studentRecord *

Vložka vypadá to pak:

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

tak děláte srovnání ukazatel, a to je důvod, proč je váš operátor není označován jako Asha allready poukázal.

Více, takže přetížení jen větší než operátor (>), ale ve vložce použít méně než operátor (<). Pokud byste se opravdu porovnat dva objekty typu studentRecord ve vložce kód should't dokonce sestavit a měl by si stěžují, že je schopen najít vhodnou méně než provozovatele.

Tím spíše mohu poukázat na některé problémy v kódu:

  1. studentRecord.studentID je typu string? Nicméně se pokusíte přiřadit mu číslo v konstruktoru. Tím se jednoduše převést na celé číslo na char a přiřadit znak řetězce - tak docela pravděpodobně není to, co jste zamýšleli.
  2. Chybí vám méně než provozovatele.

Pod vámi kódu a některé pražskéBazilice kód, který demonstruje operátor volána při porovnávání dvou instancí typu studentRecord. Můžete také vidět, jaké by byly dopady chybějící méně než provozovatele tím, že komentuje definici operátor ve třídě studentRecord (- chyby> kompilaci).

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 zakončení komentáři pravděpodobně, že by bylo dobré, aby poskytly další operátory porovnání příliš (> =, <=, == a! =.

Odpovězeno 23/02/2011 v 10:29
zdroj uživatelem

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