2016-04-22 7 views
-3

Ich schreibe verschiedene Operatorüberladungen für eine binäre Baumfunktion, die ich erstelle, die Spezifikationen erfordern eine Überladung für das Kopieren eines Baumes zu einem anderen.Operator überlastet in binärem Baum

binary_tree& binary_tree::operator=(const binary_tree &other) 
{ 

return binary_tree(); 
} 

der Test für den Bediener Arbeits als,

int main(int argc, char **argv) 
{ 
tree = new binary_tree(vector<int>{11, 5, 3, 7}); 
binary_tree temp = *tree; 
temp.insert(12); 
str = temp.inorder(); 
if (str != string("3 5 7 11 12") && temp.inorder() != tree->inorder()) 
    cerr << "test failed (assignment operator)" << endl; 
else 
    cout << "test passed (assignment operator)" << endl; 
} 

folgt Offensichtlich ist der Punkt dieses Tests ist es, einen neuen Baum Temp zu erstellen, die die Werte des Originals hat, aber ich kann‘ Es scheint so zu funktionieren, dass wenn .insert (12) aufgerufen wird, es den ursprünglichen Baum nicht verändert. Der Bediener muss basierend auf dem Test arbeiten, der in main, unedited gegeben wird.

Ich habe verschiedene Dinge im Operator = ausprobiert, aber keiner von ihnen scheint irgendeinen Effekt zu haben. Ich habe Methoden wie,

void binary_tree::copyTree(node *& tree2, node *& tree) 
{ 
if(tree == NULL) 
{ 
    tree2 = NULL; 
} 
else 
{ 
    tree2 = new node; 
    tree2->data = tree->data; 

    copyTree(tree2->left, tree->left); 
    copyTree(tree2->right, tree->right); 
} 
} 

aber mit ihnen schien nichts nützliches zu tun.

+0

Zeigen Sie uns etwas, was Sie ausprobiert haben. Nur zu sagen "Ich habe viele Dinge ausprobiert und sie haben nicht funktioniert; bitte schreibe meinen Code für mich" kommt selten hier gut voran, fürchte ich. –

+1

Eine binäre Baumklasse, keine Funktion; der Zuweisungsoperator sollte einen Verweis auf "self" zurückgeben; usw. etc. – blazs

+0

* Ich habe verschiedene Dinge im Operator = ausprobiert, aber keiner von ihnen scheint irgendeinen Effekt * zu haben. Natürlich, 'binary_tree temp = * tree;' es ruft nicht den Zuweisungsoperator auf, sondern den Kopierkonstruktor. –

Antwort

2

Alle Ihre Versuche schlagen fehl, wenn Sie ein lokales Objekt des Betreibers zurückzukehren versuchen, durch Verweis

binary_tree& binary_tree::operator=(const binary_tree &other) 
{ 
    ... 
    return binary_tree(); // <=== ouch: the reference will be invalid ! 
} 

Für Zuweisungsoperator Sie besser die Referenz des aktuellen Baum zurückkehren würde:

binary_tree& binary_tree::operator=(const binary_tree &other) 
{ 
    ...   // make your copy here 
    return *this; 
} 

Jetzt, um Ihr Kopieren zu implementieren, könnten Sie Ihre binary_tree::copyTree() wiederverwenden. Angenommen, Sie haben eine node* root in Ihrem Baum, wäre es etwa so:

binary_tree& binary_tree::operator=(const binary_tree &other) 
{ 
    copyTree (root, other.root); 
    return *this; 
} 
Verwandte Themen