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

如何通过一个类的函数修改另一个嵌套类中的成员变量?

问题解决:通过KNIGHT修改MAGE的hpm变量

你当前的问题核心是**slash()里创建的MAGE hp是局部临时对象**,和main函数中实例化的MAGE对象完全是两个独立的内存实体,所以临时对象的hpm修改不会影响外部的实际对象。你的友元声明是正确的(KNIGHT已经能访问MAGE的成员),只是缺少对目标对象的引用。

以下是两种可行的解决方案:

方案1:给slash传递目标MAGE对象的引用

这是最直接灵活的方式,让KNIGHT的攻击函数明确接收要修改的MAGE对象:

修改KNIGHT类的声明

class CHARACTERS
{
public:
    CHARACTERS();
    //...other functions yada-yada...//

    class MAGE
    {
    public:
        MAGE();
        int hpm;
        friend class KNIGHT;
    };

    class KNIGHT
    {
    public:
        KNIGHT();
        // 修改函数参数为MAGE的引用
        void slash(MAGE& target);
        friend class MAGE;
    };
};

实现slash函数

void CHARACTERS::KNIGHT::slash(MAGE& target)
{
    std::cout << "Before:" << target.hpm;
    target.hpm -= 35;
    std::cout << "After:" << target.hpm;
}

主函数中调用

int main()
{
    CHARACTERS::MAGE myMage;
    CHARACTERS::KNIGHT myKnight;
    // 传入实际的MAGE对象引用
    myKnight.slash(myMage);
    // 此时myMage.hpm已被修改为165
    return 0;
}

方案2:让CHARACTERS持有角色实例,通过外部类关联

如果你的设计中CHARACTERS是角色容器,可以让KNIGHT通过外部类访问内部的MAGE实例:

修改CHARACTERS类

class CHARACTERS
{
public:
    // 初始化成员实例
    CHARACTERS() : mage(), knight() {}
    
    // 持有MAGE和KNIGHT的实例
    MAGE mage;
    KNIGHT knight;

    class MAGE
    {
    public:
        MAGE() : hpm(200) {} // 假设默认初始化hpm为200
        int hpm;
        friend class KNIGHT;
    };

    class KNIGHT
    {
    public:
        KNIGHT() {}
        // 通过外部类对象访问MAGE实例
        void slash(CHARACTERS& owner);
        friend class MAGE;
    };
};

实现slash函数

void CHARACTERS::KNIGHT::slash(CHARACTERS& owner)
{
    std::cout << "Before:" << owner.mage.hpm;
    owner.mage.hpm -= 35;
    std::cout << "After:" << owner.mage.hpm;
}

主函数中调用

int main()
{
    CHARACTERS myChars;
    myChars.knight.slash(myChars);
    // myChars.mage.hpm已被修改
    return 0;
}

内容的提问来源于stack exchange,提问作者Ainis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:28:29