You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构体中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:15:34