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

C++字符串传递问题:多对象共享修改字符串失败求优化方案

问题分析

你的代码里,B的bString是值类型的std::string,构造函数中bString(str_)实际上是把传入的引用对象做了一次拷贝,所以B::bString和A::aString是完全独立的两个字符串对象,修改其中一个自然不会影响另一个。

简洁解决方案

方案1:使用引用成员变量

将B的成员变量改为std::string的引用,这样它就会直接绑定到传入的字符串对象,而非拷贝:

struct A {
  std::string aString = "";
};
struct B {
  std::string& bString;  // 改为引用类型

  B(std::string& str_) : bString(str_) {}
};
static void run() {
  A a;
  a.aString = "in A";
  B b(a.aString);
  b.bString += "...also in b";
  std::cout << "A: " << a.aString << std::endl;  // A: in A...also in b
  std::cout << "B: " << b.bString << std::endl;  // B: in A...also in b
}

注意:引用成员必须在构造时初始化,且要确保被引用的对象(这里是A::aString)的生命周期覆盖B对象的生命周期,避免悬空引用。

方案2:使用指针成员变量

如果需要更灵活的生命周期管理(比如后续可能需要重新指向其他字符串),可以用指针:

struct A {
  std::string aString = "";
};
struct B {
  std::string* bString;

  B(std::string* str_) : bString(str_) {}
};
static void run() {
  A a;
  a.aString = "in A";
  B b(&a.aString);
  (*b.bString) += "...also in b";  // 注意解引用指针
  std::cout << "A: " << a.aString << std::endl;  // A: in A...also in b
  std::cout << "B: " << *b.bString << std::endl; // B: in A...also in b
}

这种方式需要注意避免空指针访问,但比引用更灵活。

这两种方案都比shared_ptr包装更简洁,直接实现了多个对象共享并修改同一个字符串的需求。

内容的提问来源于stack exchange,提问作者Markstar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:57:45