Für Ihre Frage zu get_root
, ist der Compiler intelligent genug, um zu bestimmen, dass get_root
ein Freund von BinarySearchTree
ist. Das ist nicht das Problem hier. Vielmehr, wenn der Compiler diese Zeile sieht, ist es nicht kennt die BinarySearchTree
Objekt Sie es sind gefragt von der Wurzel zu lesen:
Node* x = root;
Betrachten Sie es auf diese Weise - eine Friend-Funktion ist eine kostenlose Funktion , wie jede andere freie Funktion, außer dass es private Felder lesen kann. Um jedoch die privaten Felder eines BinarySearchTree
Objekts zu lesen, muss es ein tatsächliches, ehrliches BinarySearchTree
Objekt haben, aus dem das Feld gelesen werden kann.
Dies kommt nicht mit Elementfunktionen, da eine Elementfunktion implizit relativ zu einem Empfängerobjekt funktioniert. Wenn Sie in Memberfunktionen von BinarySearchTree
über root
sprechen, interpretiert C++ es "das root
Feld des this
Objekts".
Angesichts dessen, was Sie hier versuchen, denke ich, dass Sie einfach get_root
eine Member-Funktion und nicht eine Freund-Funktion machen sollten. Sie könnten auch get_root
ändern, so dass es ein BST als Eingabe:
Node* get_root(const BinarySearchTree& bst)
{
return bst.root;
}
fragte Sie eine separate Frage, warum Sie nicht Standardargumente wie diese geben kann:
void BinarySearchTree ::insert_node(int inserted_key, Node* traverse_ptr = root);
Die C++ spec einfach nur erlaubt Ihnen nicht, Mitgliedsvariablen als Standardwerte für Mitgliedsfunktionen zu verwenden. Ich glaube, dass dies etwas mit Implementierungsproblemen zu tun hat, bei denen der Zeiger auf ein Objekt in die Mitte eines Objekts zeigen kann, wenn Sie Mehrfachvererbung verwenden, und der Offset zu dem Feld nicht statisch bekannt sein kann.
Allerdings können Sie dieses Problem umgehen, indem Sie etwas wie dies zu tun:
class BinarySearchTree {
public:
void insert_node(int inserted_key);
void insert_node(int inserted_key, Node* traverse_ptr);
}
void BinarySearchTree::insert_node(int inserted_key) {
insert_node(inserted_key, root);
}
void BinarySearchTree::insert_node(int inserted_key, Node* traverse_ptr) {
...
}
Dies verwendet anstelle von Standardargumente Überlastung und mehr oder weniger das Gleiche erreicht.
Ich schlage vor, dass "BinarySearchTree" und "Node" dasselbe sind, nicht zwei verschiedene Dinge. Jeder Knoten ist eigentlich die Wurzel eines BST. – EJP