如何通过一个类的函数修改另一个嵌套类中的成员变量?
问题解决:通过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
相关产品推荐
相关产品推荐

