C++游戏开发中如何通过继承访问其他类的private私有变量
实现方案
C++中跨类访问私有成员有两种通用实现方式,同时你现有代码的继承逻辑、属性计算逻辑也需要对应调整:
- 方案1(优先推荐,符合封装原则):给私有成员所属类添加公有的get/set访问接口
在Enemies类的public区域新增对应属性的获取接口,外部类仅能通过受控的接口读取属性,不会破坏类的封装安全性:
同时你当前class Enemies { private: std::vector <std::string> enemies = { "Mutant Orc", "Mutant Bear", "Giant Elephant", "Giant Snake"}; int enemyAttack = 5; int enemyHealth = 40; public: // 新增公有get接口 std::vector<std::string> getEnemyList() const { return enemies; } int getEnemyAttack() const { return enemyAttack; } int getEnemyHealth() const { return enemyHealth; } };Player私有继承PlayerClass时,无法直接访问PlayerClass的私有成员attackBonus、healthBonus,需要将这两个属性改为protected权限,或者新增对应接口,同时修正returnWarriorBonus的逻辑(你原有代码里的&是位与操作,不符合属性加成的预期,应该分开返回或者返回结构体):
最后修改class PlayerClass { protected: // 改成protected让派生类可访问 int attackBonus = 0; int healthBonus = 0; public: // 修正加成返回逻辑 std::pair<int, int> returnWarriorBonus() { attackBonus += 5; healthBonus += 20; return {attackBonus, healthBonus}; } void pickClass() { std::cout << "1. Warrior" << std::endl; } };setPlayerClass逻辑,将加成应用到Player的私有属性上:void setPlayerClass(int x) { while (true) { std::cout << "Choose class: " << std::endl; std::cin >> x; if (x == 1) { // C++17及以上支持结构化绑定,低版本可以用bonus.first、bonus.second取值 auto [atkBonus, hpBonus] = returnWarriorBonus(); attack += atkBonus; health += hpBonus; break; // 选完退出循环,避免一直卡死在选择界面 } else { std::cout << "Invalid option, try again" << std::endl; } } } - 方案2:友元声明(适合强关联类场景)
如果确认Player和Enemies是强关联类,不需要严格的封装隔离,可以在Enemies类中声明Player为友元,这样Player可以直接访问Enemies的所有私有成员:
后续在class Enemies { private: std::vector <std::string> enemies = { "Mutant Orc", "Mutant Bear", "Giant Elephant", "Giant Snake"}; int enemyAttack = 5; int enemyHealth = 40; public: friend class Player; // 友元声明 };Player的成员函数中,只要拿到Enemies类的实例,就可以直接读取它的私有属性。
其他代码问题修正
你现有代码中std::vector <int> healthPotions[2];写法错误,这是声明了一个长度为2的vector<int>数组,如果你是要初始化一个容量为2、存储int的vector,应该改为std::vector<int> healthPotions(2);。
内容的提问来源于stack exchange,提问作者NewbCoder
相关产品推荐
相关产品推荐

