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
相关产品推荐
相关产品推荐

