访问没有对象的私有成员变量
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;
可以这样想 - friend 函数是一个自由函数,就像任何其他自由函数一样,除了它可以读取私有字段。但是,为了读取BinarySearchTree
对象的私有字段,它需要一个实际的、诚实善良的BinarySearchTree
对象来读取该字段。
这不会提供成员函数,因为成员函数相对于某个接收器对象隐式操作。在BinarySearchTree
的成员函数中,如果你谈论root
,C++把它解释为"this
对象的root
域"。
鉴于您在这里尝试做的事情,我认为您应该只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) {
...
}
这使用重载而不是默认参数,并或多或少地完成相同的事情。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 将包含C样式数组的对象初始化为成员变量(C++)
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 在循环中按顺序遍历成员变量
- c++类声明时,相同的例程,不同的成员变量类型
- 如何从另一个文件继承私有成员变量和公共函数
- 在C++类中,是否必须初始化作为数组的成员变量
- 如何从子成员函数修改父公共成员变量
- 我可以在 C++ 中将数据成员/变量从其定义之外添加到结构中吗?
- 从私有成员变量的成员方法返回unique_ptr
- 在派生类中使用基类的私有成员变量的最佳方法
- 静态 constexpr 类成员变量对多线程读取是否安全?
- C++:是否可以使用非静态成员变量模板?
- 打印所有继承的类成员变量和方法
- 如何在复杂继承中访问静态成员变量
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 成员变量与函数概念检查