我正在研究C ++ 11应用程序。我正在实施赋值运算符。 我希望如果我在赋值后修改一个值,则两个对象都会被修改。
示例:
Object o1, o2;
o1.setId("id1");
o2 = o1;
o2.setId("id2");
cout << o1.getId(); ------> this returns id2
我怎么能实现这一目标?任何想法
提前致谢
答案 0 :(得分:4)
要允许多个实例共享公共对象,您可能希望使用std::shared_ptr<T>
作为其内部状态:
struct Object
{
Object() : _data(new std::string()) {}
void setId(const std::string& value) { *_data = value; }
private:
std::shared_ptr<std::string> _data;
};
复制Object
按要求对其内部数据进行浅层复制:
int main()
{
Object o1, o2;
o1.setId("1");
o2 = o1;
Object o3(o1);
o2.setId("2");
std::cout << "o1: " << *o1._data << "\n"
<< "o2: " << *o2._data << "\n"
<< "o3: " << *o3._data << "\n"; // Object._data set to public: for this to work
}
打印:
2
2
2
答案 1 :(得分:1)
使用参考:
Object o1;
o1.setId("id1");
Object &o2 = o1;
o2.setId("id2");
cout << o1.getId(); // id2
引用实际上是原始对象的另一个名称。
答案 2 :(得分:-2)
据我所知,“浅拷贝”不是
...如果我在赋值后修改了一个值,则两个对象都会被修改。
任何值(指针)的浅拷贝只是值(指针)的副本。 某些类对象的浅拷贝只是一个成员副本。
默认赋值运算符可以解决问题。
如果你来自C#般的土地:
写作时
Object o1;
Object o2;
你已经在内存中创建了两个独立的对象(在堆栈上)。 当你写作
o2 = o1;
默认情况下,您执行浅拷贝:只将存储在对应于o1的一块内存中的所有数据复制到与o2对应的内存中。就如此容易。基本上C#也是如此,唯一的区别是o1和o2是那里的引用。因此,您只需将一个引用的值(不是值引用引用!)复制到另一个引用。
所以重点是它不是关于
...实现赋值运算符。
但是自己复制引用或对象值。
在c ++编写o1
中,您获得了对象值,而不是对象的引用。
而且,在c ++中你不能复制引用。但你可以复制指针。
Object* o1 = new Object;
Object* o2;
o2 = o1; // now pointing to the same object
但请记住,c ++没有GC,所以每次在堆上分配内存时,你必须自己稍后处理它(除非你使用智能指针,但那是另一个主题)。