You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 11:54:00