访问没有对象的私有成员变量
Accessing a private member variable without object
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;
}
编译器说 error C2065: 'root' : undeclared identifier
为什么编译器不能识别 root
尽管 get_root
是友元函数?
同样,为什么我不能像这样使用默认参数?
void BinarySearchTree::insert_node(int inserted_key,Node* traverse_ptr = root);
对于你关于 get_root
的问题,编译器足够聪明,可以确定 get_root
是 BinarySearchTree
的朋友。这不是这里的问题。相反,当编译器看到这一行时,它不知道 哪个 BinarySearchTree
对象 您要求它从以下位置读取根:
Node* x = root;
这样想 - 友元函数是一个自由函数,就像任何其他自由函数一样,只是它可以读取私有字段。但是,为了读取 BinarySearchTree
对象的私有字段,它需要有一个实际的、诚实的 BinarySearchTree
对象来读取字段。
这不涉及成员函数,因为成员函数隐式地相对于某个接收者对象进行操作。在 BinarySearchTree
的成员函数中,如果你谈论 root
,C++ 将其解释为 "the root
field of the this
object."
考虑到您在这里尝试做的事情,我认为您应该将 get_root
设为成员函数而不是友元函数。您还可以更改 get_root
以将 BST 作为输入:
Node* get_root(const BinarySearchTree& bst)
{
return bst.root;
}
你问了一个单独的问题,为什么你不能像这样给出默认参数:
void BinarySearchTree ::insert_node(int inserted_key, Node* traverse_ptr = root);
C++ 规范不允许您将成员变量用作成员函数的默认值。我相信这与实现问题有关,如果您使用多重继承,那么指向对象的指针可能指向对象的中间,并且无法静态知道字段的偏移量。
但是,您可以通过执行以下操作来解决此问题:
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) {
...
}
这使用重载而不是默认参数并完成或多或少相同的事情。
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;
}
编译器说 error C2065: 'root' : undeclared identifier
为什么编译器不能识别 root
尽管 get_root
是友元函数?
同样,为什么我不能像这样使用默认参数?
void BinarySearchTree::insert_node(int inserted_key,Node* traverse_ptr = root);
对于你关于 get_root
的问题,编译器足够聪明,可以确定 get_root
是 BinarySearchTree
的朋友。这不是这里的问题。相反,当编译器看到这一行时,它不知道 哪个 BinarySearchTree
对象 您要求它从以下位置读取根:
Node* x = root;
这样想 - 友元函数是一个自由函数,就像任何其他自由函数一样,只是它可以读取私有字段。但是,为了读取 BinarySearchTree
对象的私有字段,它需要有一个实际的、诚实的 BinarySearchTree
对象来读取字段。
这不涉及成员函数,因为成员函数隐式地相对于某个接收者对象进行操作。在 BinarySearchTree
的成员函数中,如果你谈论 root
,C++ 将其解释为 "the root
field of the this
object."
考虑到您在这里尝试做的事情,我认为您应该将 get_root
设为成员函数而不是友元函数。您还可以更改 get_root
以将 BST 作为输入:
Node* get_root(const BinarySearchTree& bst)
{
return bst.root;
}
你问了一个单独的问题,为什么你不能像这样给出默认参数:
void BinarySearchTree ::insert_node(int inserted_key, Node* traverse_ptr = root);
C++ 规范不允许您将成员变量用作成员函数的默认值。我相信这与实现问题有关,如果您使用多重继承,那么指向对象的指针可能指向对象的中间,并且无法静态知道字段的偏移量。
但是,您可以通过执行以下操作来解决此问题:
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) {
...
}
这使用重载而不是默认参数并完成或多或少相同的事情。