如何访问类中结构体的数据成员?类成员函数访问结构体成员报错解决
嘿,我来帮你解决这两个C++的问题哈~
问题1:如何访问类中结构体的数据成员?
这个得分两种常见场景来处理:
- 如果类中的结构体是public权限(就像你代码里的
Node),有两种访问方式:- 先通过类名限定结构体类型,实例化结构体对象后直接访问成员:
bst myTree; bst::Node myNode; myNode.data = 10; // 直接访问结构体的public数据成员 - 如果类本身持有一个结构体类型的成员变量(比如bst类里有个
Node* root),可以通过类对象直接访问这个成员的子属性:class bst { public: struct Node { int data; Node* left; Node* right; }; Node* root = nullptr; // 把结构体类型的成员放在类里 }; int main() { bst myTree; if (myTree.root != nullptr) { cout << myTree.root->data << endl; } }
- 先通过类名限定结构体类型,实例化结构体对象后直接访问成员:
- 如果结构体是private权限,那你需要在类中编写getter/setter函数,或者把需要访问它的函数声明为友元,不过这种情况一般是结构体只给类内部使用时才会这么设计。
问题2:让show()能够访问root的最佳方式
你现在的问题核心是root的位置放错了!你把root = NULL定义在Node结构体内部,这意味着每个Node对象都会自带一个root成员,但实际上root是整个二叉搜索树的根节点,它属于bst这个类,而不是单个节点的属性。所以show()作为bst的成员函数,自然找不到Node结构体里的root——它不在当前作用域呀。
最佳解决方式就是把root移到bst类的public区域,这样show()作为类的成员函数就能直接访问它了,完全符合你不想用getter/setter的需求。修正后的示例代码如下:
#include <iostream> using namespace std; class bst { public: struct Node { int data; Node *left; Node *right; // 删掉Node里的root,它不属于单个节点 // 可以加个构造函数,方便创建节点 Node(int val) : data(val), left(nullptr), right(nullptr) {} }; Node* root = nullptr; // 把根节点放在bst类里,作为类的成员 void show() { // 现在能直接访问root了,比如实现一个中序遍历 inorderTraversal(root); } private: // 封装遍历逻辑,对外只暴露show() void inorderTraversal(Node* node) { if (node == nullptr) return; inorderTraversal(node->left); cout << node->data << " "; inorderTraversal(node->right); } }; int main() { bst myTree; // 手动创建节点测试 myTree.root = new bst::Node(5); myTree.root->left = new bst::Node(3); myTree.root->right = new bst::Node(7); myTree.show(); // 现在调用show不会报错啦 return 0; }
这种设计的优势在于:root是整个二叉搜索树的核心属性,属于树这个整体,放在bst类里完全符合逻辑,同时让类的成员函数可以直接访问,不需要额外的getter,代码结构也更清晰。
内容的提问来源于stack exchange,提问作者Razmode
相关产品推荐
相关产品推荐

