C++ Qt使用Getter无法获取readJson设置的正确值求助
问题原因与解决方案:Getter无法获取readJson设置的值
嘿,我一眼就看出问题所在了——你遇到的是局部变量作用域和未初始化对象导致的问题,咱们一步步拆解:
问题根源
- 局部对象的生命周期问题
在readJson()函数里,你创建的nsline、ewline这些对象都是局部变量,当函数执行完最后一行代码后,这些对象就会被系统销毁,它们存储的计数数值也跟着消失了。
而在showpiechartbtnReleased()里,你又重新创建了一组全新的nsline等对象,这些对象和readJson()里的完全是两个独立的实例,没有任何关联。
- 未初始化的垃圾值
新创建的这些对象如果没有给成员变量设置默认初始值,那么它们的成员变量会是内存里的随机垃圾数据,这就是你看到那些奇怪整数的原因(比如1514685496、-1479339952)。
解决方案(推荐第一种)
方案1:使用类成员变量(最规范的做法)
把nsline、ewline等对象定义为包含这两个函数的类的成员变量,这样两个函数操作的是同一个对象实例,数据就能共享了。
步骤1:在类头文件中声明成员变量
假设你的两个函数属于MainGUI类,在头文件里添加:
class MainGUI { private: // 把这些对象声明为类的成员变量 nsline m_nsline; ewline m_ewline; neline m_neline; ccline m_ccline; dtline m_dtline; orline m_orline; public: void readJson(); void showpiechartbtnReleased(); // ... 其他成员函数 };
步骤2:修改readJson()函数
删除原来的局部对象声明,直接使用类的成员变量:
void MainGUI::readJson() { // ... 前面的JSON解析代码不变 // 删掉这些局部对象声明: // nsline nsline; // ewline ewline; // ... int nsl = 0, ewl = 0, nel = 0, ccl = 0, dtl = 0, orl = 0; int totalline = tsds.getLine().size(); // ... 统计逻辑不变 // 直接给成员变量赋值 m_nsline.setlines(nsl); m_ewline.setlines(ewl); m_neline.setlines(nel); m_ccline.setlines(ccl); m_dtline.setlines(dtl); m_orline.setlines(orl); // ... 调试输出不变 }
步骤3:修改showpiechartbtnReleased()函数
同样删除局部对象声明,直接读取成员变量的值:
void MainGUI::showpiechartbtnReleased() { // 删掉这些局部对象声明: // nsline nsline; // ewline ewline; // ... // 直接从成员变量获取值 int nsl = m_nsline.getlines(); int ewl = m_ewline.getlines(); int nel = m_neline.getlines(); int ccl = m_ccline.getlines(); int dtl = m_dtline.getlines(); int orl = m_orline.getlines(); // ... 饼图绘制逻辑不变 }
方案2:使用全局变量(不推荐,仅临时场景用)
如果不想修改类结构,可以把nsline等对象声明为全局变量,这样所有函数都能访问同一个实例。但全局变量会增加代码耦合度,不利于后续维护,所以尽量不用。
在.cpp文件顶部添加全局声明:
nsline global_nsline; ewline global_ewline; neline global_neline; ccline global_ccline; dtline global_dtline; orline global_orline;
然后在两个函数里直接使用这些全局对象,替换原来的局部对象即可。
方案3:传递对象引用(跨类场景用)
如果readJson()和showpiechartbtnReleased()属于不同的类,可以在调用showpiechartbtnReleased()时,把readJson()里的对象以引用方式传递过去:
修改showpiechartbtnReleased()的参数:
void MainGUI::showpiechartbtnReleased(nsline& ns, ewline& ew, neline& ne, ccline& cc, dtline& dt, orline& orl) { int nsl = ns.getlines(); int ewl = ew.getlines(); // ... 后续饼图逻辑不变 }
然后在readJson()里调用该函数时传入对象:
void readJson() { // ... 统计完成后 MainGUI gui; // 假设这里有MainGUI实例 gui.showpiechartbtnReleased(nsline, ewline, neline, ccline, dtline, orline); }
注意:这种方式要确保传递引用时,原对象还处于生命周期内,避免出现悬垂引用。
总结
最推荐的是方案1,使用类成员变量,既能保证数据的一致性,又能让代码结构更清晰,符合面向对象的设计思想。
内容的提问来源于stack exchange,提问作者Zelsey Nanos
相关产品推荐
相关产品推荐

