2017-09-16 3 views
1
class BinarySearchTree 
{ 
private: 
    Node *root; 
public: 
    BinarySearchTree() ; 
    ~BinarySearchTree(); 
    void insert_node(int, Node*); 
    void print_tree(Node *); 
    friend Node* get_root(); 

}; 

/**********************BinarySearchTree definition***************/ 
BinarySearchTree::BinarySearchTree() : root(nullptr) 
{ 

} 

Node* get_root() 
{ 
    Node* x= root; 
    return x; 
} 

Der Compiler sagt, dass error C2065: 'root' : undeclared identifier Warum kann der Compiler erkennen root obwohl get_root ist ein Freund-Funktion?eine private Variable ohne Objekt Zugriff auf

Ähnlich, warum kann ich nicht Standardargumente wie dieses verwenden?

void BinarySearchTree::insert_node(int inserted_key,Node* traverse_ptr = root); 
+0

Ich schlage vor, dass "BinarySearchTree" und "Node" dasselbe sind, nicht zwei verschiedene Dinge. Jeder Knoten ist eigentlich die Wurzel eines BST. – EJP

Antwort

1

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.

Verwandte Themen