获取右值地址警告问题:类getter返回值取址报错
问题原因与解决方法
问题根源
你的getMpuTest()方法返回的是mpuTest成员变量的副本——也就是一个临时创建的右值对象。右值是临时存在的,没有持久的内存地址,所以编译器不允许你用&取它的地址,这就是报错taking address of rvalue的原因。
两种可行解决办法
方法一:让getter返回引用
修改Test3类的getMpuTest方法,让它返回原成员变量的引用(左值),这样就能合法获取地址:
class Test3 { private: mpu mpuTest; public: // 返回引用,而非副本 mpu& getMpuTest() { return mpuTest; } };
这样&test3Var.getMpuTest()拿到的就是test3Var内部mpuTest成员的真实内存地址,是合法的左值,不会触发错误。
⚠️ 注意:要保证test3Var的生命周期比fsVar长,否则fs类里保存的指针会变成野指针,访问时会触发未定义行为。
方法二:新增获取指针的方法
如果不想暴露成员的引用(比如担心外部直接修改成员变量),可以在Test3里专门加一个返回指针的方法:
class Test3 { private: mpu mpuTest; public: mpu getMpuTest() { return mpuTest; } // 新增方法返回成员的指针 mpu* getMpuTestPtr() { return &mpuTest; } };
然后在main里调用这个方法传参:
fsVar.initialize(test3Var.getMpuTestPtr());
这样既保留了原getter的封装性,又能合法传递成员变量的地址。
内容的提问来源于stack exchange,提问作者user18353868
相关产品推荐
相关产品推荐

