结构体中wstring值修改失败而string成功的原因排查
C++结构体中wstring成员修改失效的原因及解决方法
你的代码核心问题在于setter函数返回的是结构体副本而非引用,导致链式调用时修改的是临时对象,而非原结构体实例:
setFlag1("string")确实修改了原testStruct的falg1,但函数返回的是原对象的临时副本- 后续的
setFlag2(L"Wstring")修改的是这个临时副本的falg2,原testStruct的falg2完全没被改动
这就是为什么string类型成员修改生效,而wstring成员始终为空。
修正后的代码
struct TestStruct{ string falg1; wstring falg2; // 返回类型改为引用TestStruct& TestStruct& setFlag1(string str ) { falg1 = str; return *this; } // 返回类型改为引用TestStruct& TestStruct& setFlag2(wstring str ) { falg2 = str; return *this; } }; int main(int argc, char ** argv) { TestStruct testStruct; testStruct.setFlag1("string") .setFlag2(L"Wstring"); wcout << "string length:" << testStruct.falg1.size() << endl; wcout << "Wstring content:" << '[' << testStruct.falg2 << ']' << endl; wcout << "Wstring length:" << '[' << testStruct.falg2.size() << ']' << endl; }
关键修改说明
把两个setter函数的返回类型从TestStruct改为TestStruct&(引用类型),这样返回的是原对象的引用而非副本。链式调用时,所有操作都会直接作用在最初的testStruct对象上,falg2的修改自然会生效。
修正后输出
string length:6 Wstring content:[Wstring] Wstring length:[7]
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

