如何实现赋值运算符以便多个实例共享公共数据?

How to implement an assignment operator so multiple instances share common data?

我正在开发 C++11 应用程序。我正在实施赋值运算符。 我希望如果我在赋值后修改一个值,两个对象都会被修改。

示例:

Object o1, o2;
o1.setId("id1");
o2 = o1;
o2.setId("id2");
cout << o1.getId();  ------> this returns id2

我怎样才能做到这一点?任何想法

提前致谢

使用参考:

Object o1;
o1.setId("id1");
Object &o2 = o1;
o2.setId("id2");
cout << o1.getId(); // id2

引用实际上是原始对象的另一个名称。

要允许多个实例共享一个公共对象,您可能需要对其内部状态使用 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 做 shallow-copy 它的内部数据:

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

据我所知,"shallow copy"不是

...if I modify one value after the assignment both objects get modified.

任何值(指针)的浅拷贝只是一个值(指针)的拷贝。 某些 class 对象的浅拷贝只是成员拷贝。

默认赋值运算符就可以了。

如果您来自类似 C# 的国家:

写的时候

Object o1;
Object o2;

您已经在内存中(在堆栈上)创建了两个独立的对象。 当你写

o2 = o1; 

默认情况下你做的是浅拷贝:只是将存储在o1对应的一块内存中的所有数据复制到o2对应的内存中。就如此容易。本质上 C# 做同样的事情,唯一的区别是 o1 和 o2 是那里的引用。所以你只需将一个引用的值(不是引用所指的值!)复制到另一个引用。

所以重点是这一切都不是

...implementing assignment operator.

但复制引用或对象值本身。 在 C++ 中编写 o1 你得到的是对象值,而不是对对象的引用。 此外,在 C++ 中你不能复制引用。但是您可以复制指针。

Object* o1 = new Object;
Object* o2;
o2 = o1; // now pointing to the same object

但请记住,c++ 没有 GC,因此每次在堆上分配内存时,您必须稍后自行释放它(除非您使用智能指针,但那是另一个话题)。