C++中MenuItem无法修改Menu类成员属性问题咨询
你遇到的问题核心在于MenuItem里存储的是Menu的副本而不是原对象的引用/指针,所以调用this->link.currentMenu.clear()时,只是修改了副本的属性,原Menu对象完全没变化。先看你的代码片段:
class Menu { public: vector<MenuItem> currentMenu; void init(); void show(); void trigger(); }; class MenuItem { private: std::string text; Menu link; // 这里是值类型,会创建Menu的副本 public: MenuItem(Menu &menu, string &text); string getText(); void onEnter(); }; // 调用时修改的是副本,原Menu无变化 void MenuItem::onEnter() { this->link.currentMenu.clear(); }
下面给你两种可行的修改方案:
方案1:将link改为引用类型
引用必须在构造时初始化,且一旦绑定就不能更改,刚好匹配你的场景(MenuItem绑定到某个Menu对象后不会更换):
修改后的MenuItem类:
class MenuItem { private: std::string text; Menu& link; // 改为引用类型 public: // 必须用构造函数初始化列表初始化引用 MenuItem(Menu &menu, string &text) : link(menu), text(text) {} string getText(); void onEnter(); }; // 现在修改的是原Menu对象的属性 void MenuItem::onEnter() { this->link.currentMenu.clear(); }
注意:C++中引用类型的成员变量必须通过构造函数初始化列表完成初始化,不能在构造函数体内赋值,这是语法硬性要求。
方案2:将link改为指针类型
如果后续你需要动态更换MenuItem绑定的Menu对象,指针会更灵活:
修改后的MenuItem类:
class MenuItem { private: std::string text; Menu* link; // 改为指针类型 public: // 传入Menu引用后取地址赋值给指针 MenuItem(Menu &menu, string &text) : link(&menu), text(text) {} string getText(); void onEnter(); }; // 使用指针访问原对象的成员 void MenuItem::onEnter() { this->link->currentMenu.clear(); }
两种方案都能让你在onEnter方法里成功修改原Menu对象的currentMenu属性,你可以根据自己的业务需求选择。
内容的提问来源于stack exchange,提问作者Angus123
相关产品推荐
相关产品推荐

